具有SNI的本地HTTPS服务器

时间:2018-04-27 04:19:06

标签: ssl openssl sni

有大量关于cURL和SSL的信息,但关于编写服务器的信息并不多。我有一个用PHP编写的小型本地服务器,我希望启用TLS / SSL。我的服务器在安全连接上崩溃时遇到问题。我只收到错误,“PHP警告:stream_socket_accept():无法启用加密”。我有一个相同的服务器运行没有TLS,它工作正常。我知道它是证书,或与证书的连接。但是,我不确定如何生成证书,如何将它们加入PEM或其他内容是错误的。此外,对于我们的域,我在下面的代码中使用了* .domain.tld,以及在证书创建中使用了本地名称。

此外,无论请求的域是什么,Web浏览器中显示的证书都显示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似乎遵循自己的规则。

我在这里缺少什么想法?

1 个答案:

答案 0 :(得分:0)

我的问题是在证书创建期间没有设置SAN。链接https://serverfault.com/questions/880804/can-not-get-rid-of-neterr-cert-common-name-invalid-error-in-chrome-with-self纠正了我的问题。