Ada banyak sekali informasi yang tersedia tentang cURL dan SSL, tetapi tidak banyak informasi yang tersedia tentang penulisan server. Saya memiliki server lokal kecil yang ditulis dalam PHP yang saya ingin TLS/SSL diaktifkan. Saya mengalami masalah dengan server saya yang mogok saat koneksi aman. Saya hanya menerima pesan kesalahan, "Peringatan PHP: stream_socket_accept(): Gagal mengaktifkan kripto". Saya memiliki server identik yang berjalan tanpa TLS, dan berfungsi dengan baik. Saya tahu itu adalah sertifikat, atau koneksi ke/membaca sertifikat. Namun, saya tidak yakin apakah ini kesalahan dalam cara saya membuat sertifikat, cara menggabungkannya ke PEM, atau hal lainnya. Selain itu, untuk domain kami, saya telah menggunakan *.domain.tld pada kode di bawah ini, serta nama lokal dalam pembuatan sertifikat.
Selain itu, sertifikat yang ditampilkan di browser web menunjukkan sertifikat 127.0.0.1 dan bukan sertifikat localhost (atau domain lain) terlepas dari domain yang diminta. Apakah itu karena 127.0.0.1 disetel sebagai sertifikat lokal? Tentang sertifikat- ini adalah kode saya saat ini untuk membuat file .pem untuk digunakan di server:
sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout apache.key -out apache.crt
apache.crt apache.key > joined.pem
Terjemahan dasar kode server adalah:
<?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;
Satu hal lagi, sandi apa yang tepat untuk disetel untuk memenuhi tuntutan semua browser utama di luar sana, Chrome tampaknya bermain dengan aturannya sendiri.
Adakah ide apa yang saya lewatkan di sini?