Существует масса информации о cURL и SSL, но не так много о написании сервера. У меня есть небольшой локальный сервер, написанный на PHP, и я хотел бы включить TLS / SSL. У меня проблемы с моим сервером, сбой при безопасных соединениях. Я получаю только сообщение об ошибке «Предупреждение PHP: stream_socket_accept (): не удалось включить шифрование». У меня есть идентичный сервер, работающий без TLS, и он работает нормально. У меня есть идея, что это сертификаты, или подключение к / чтение сертификатов. Однако я не уверен, является ли это ошибкой в том, как я сгенерировал сертификаты, как я их подключил к PEM или что-то еще. Также для наших доменов я использовал * .domain.tld как в приведенном ниже коде, так и в качестве локального имени при создании сертификата.
Кроме того, сертификаты, показанные в веб-браузере, показывают сертификат 127.0.0.1, а не сертификаты локального (или других доменов) независимо от запрашиваемого домена. Это потому, что 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, похоже, играет по своим собственным правилам.
Есть идеи, что мне здесь не хватает?