มีข้อมูลมากมายเกี่ยวกับ cURL และ SSL แต่ไม่มีข้อมูลเกี่ยวกับการเขียนเซิร์ฟเวอร์มากนัก ฉันมีเซิร์ฟเวอร์ท้องถิ่นขนาดเล็กที่เขียนด้วย PHP ซึ่งฉันต้องการเปิดใช้งาน TLS/SSL ฉันมีปัญหากับเซิร์ฟเวอร์ของฉันหยุดทำงานเมื่อมีการเชื่อมต่อที่ปลอดภัย ฉันได้รับเฉพาะข้อผิดพลาด "คำเตือน PHP: stream_socket_accept(): ไม่สามารถเปิดใช้งาน crypto" ฉันมีเซิร์ฟเวอร์เหมือนกันที่ทำงานโดยไม่มี TLS และทำงานได้ดี ฉันมีความคิดว่ามันเป็นใบรับรอง หรือการเชื่อมต่อกับ/การอ่านใบรับรอง อย่างไรก็ตาม ฉันไม่แน่ใจว่าเป็นข้อผิดพลาดเกี่ยวกับวิธีสร้างใบรับรอง วิธีเข้าร่วม PEM หรืออย่างอื่น นอกจากนี้ สำหรับโดเมนของเรา ฉันใช้ *.domain.tld ทั้งในโค้ดด้านล่างและชื่อท้องถิ่นในการสร้างใบรับรอง
นอกจากนี้ ใบรับรองที่แสดงในเว็บเบราว์เซอร์จะแสดงใบรับรอง 127.0.0.1 ไม่ใช่ใบรับรอง localhost (หรือโดเมนอื่น) โดยไม่คำนึงถึงโดเมนที่ร้องขอ นั่นเป็นเพราะว่า 127.0.0.1 ถูกตั้งค่าเป็นใบรับรองท้องถิ่นใช่ไหม เกี่ยวกับใบรับรอง- นี่คือรหัสปัจจุบันของฉันสำหรับการสร้างไฟล์ .pem เพื่อใช้บนเซิร์ฟเวอร์:
sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout apache.key -out apache.crt
apache.crt apache.key > joined.pem
ความหมายพื้นฐานของรหัสเซิร์ฟเวอร์คือ:
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
$flags = STREAM_SERVER_BIND|STREAM_SERVER_LISTEN;
$ctx = stream_context_create(['ssl' => [
'local_cert' => "{path}/Websites/127.0.0.1/certs/joined.pem",
'SNI_server_certs' => [
"127.0.0.1" => "{path}/Websites/127.0.0.1/certs/joined.pem",
"localhost" => "{path}//Websites/localhost/certs/joined.pem",
]
]]);
stream_context_set_option($ctx, 'ssl', 'ssl_method', 'STREAM_CRYPTO_METHOD_TLSv23_SERVER');
stream_context_set_option($ctx, 'ssl', 'allow_self_signed', true);
stream_context_set_option($ctx, 'ssl', 'verify_peer', false);
stream_context_set_option($ctx, 'ssl', 'ciphers', "HIGH");
$socket = stream_socket_server("tls://127.0.0.1:8443", $errno, $errstr, $flags, $ctx);
while ( $client = stream_socket_accept($socket, "-1", $clientIP)):
$msg = fread($client, 8192);
$resp = "HTTP/1.1 200 OK\r\nContent-type: text/html\r\n\r\n<h1>Hi, you are secured.<br>{$msg}";
fwrite($client,$resp );
fclose($client);
endwhile;
อีกประการหนึ่งคือรหัสที่เหมาะสมในการตั้งค่าเพื่อทำให้เบราว์เซอร์หลัก ๆ ทั้งหมดพอใจ Chrome ดูเหมือนจะเล่นตามกฎของมันเอง
มีความคิดใดที่ฉันขาดหายไปที่นี่?