【问题标题】:Local HTTPS server with SNI带 SNI 的本地 HTTPS 服务器
【发布时间】: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/… 纠正了我的问题。没有你就做不到!

标签: ssl openssl sni


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2018-05-22
    • 1970-01-01
    • 2021-09-20
    • 2017-04-13
    • 2017-08-09
    • 1970-01-01
    • 2014-01-18
    • 2013-02-21
    • 2014-05-17
    相关资源
    最近更新 更多