Локальный HTTPS-сервер с SNI - PullRequest
0 голосов
/ 27 апреля 2018

Существует масса информации о 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, похоже, играет по своим собственным правилам.

Есть идеи, что мне здесь не хватает?

1 Ответ

0 голосов
/ 01 мая 2018

Моя проблема не заключалась в настройке SAN при создании сертификата. Ссылка https://serverfault.com/questions/880804/can-not-get-rid-of-neterr-cert-common-name-invalid-error-in-chrome-with-self исправила мои проблемы.

...