【发布时间】:2018-04-27 04:19:05
【问题描述】:
有大量关于 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) 您的第二个命令似乎缺少一只猫(喵?) (2) 您说您使用了 '*.domain.tld' 但您明显损坏的代码使用了 'localhost' 和 ' 127.0.0.1' - 这些对于某些协议可能是等价的,但对于 TLS/HTTPS 则完全不同 (3) 你没有说是否/如何设置 SubjectAltNames 扩展 (SAN),它必须在配置中文件不在命令行上(除非您使用带有进程替换的 shell);目前 Chrome,但不是其他主要浏览器,拒绝缺少 SAN 的证书。 (这与密码无关,Chrome 接受与其他密码相同的密码。)
-
感谢您的回复。我看到格式在我的复制和粘贴上发生了一些变化。我也没有在创建 pem 文件时包含 cat。您能否在 SAN 上进行更多扩展?我想你在那里做点什么……
-
谢谢@dave_thompson_085 问题是未正确设置 SAN。链接serverfault.com/questions/880804/… 纠正了我的问题。没有你就做不到!