3

我阅读了很多 php 手册页,但只在上下文中找到了有关 SNI 支持的信息 - http://www.php.net/manual/en/context.ssl.php

当PHP作为服务器工作时,是否可以获得浏览器发送的SNI?服务器是使用标准 stream_socket_server() 创建的,如例如中所述。这篇文章:http ://www.php.net/manual/en/function.stream-socket-server.php#98616

4

1 回答 1

5

是的,服务器端 SNI 支持在 PHP >= 5.6 中可用

示例用法:

$ctx = stream_context_create(["ssl" => [
    "local_cert" => "/path/to/cert.pem",
    "SNI_server_certs" => [
        "domain1.com" => "/path/to/domain1.pem",
        "*.domain2.com" => "/path/to/domain2.pem",
        "domain3.com" => "/path/to/domain3.pem"
    ]
]]);

笔记:

  • 如果"SNI_server_certs"客户端握手通告 SNI 功能,SSL 上下文选项会将主机名映射到适当的证书。
  • *.如果客户端请求主主机名或其任何子域,则前缀 a将使用匹配的证书。因此,在上面的示例中,我们的domain2.pem将同时用于对domain2.comsubdomain.domain2.com的请求
  • ctx 选项对"SNI_server_certs"客户端流没有影响。
  • 从 5.6 开始,服务器和客户端默认启用 SNI 支持。但是,服务器必须指定"SNI_server_certs"数组才能实际使用 SNI 扩展。
  • 如果"SNI_enabled" => false还传递了 ctx 选项,则该"SNI_server_certs"数组无效。
  • 虽然支持 SNI 本身就足以成功地与许多客户端协商 TLS 握手,但服务器仍必须指定"local_cert"ctx 选项,否则将面临来自不支持 SNI 扩展的客户端连接失败的风险。

在 PHP 5.6 之前,服务器端 SNI 是不可能的...

这是因为加密的 PHP 服务器目前仅在内部使用单个 OpenSSL SSL_CTXC 结构。在服务器中部署 SNI 需要SSL_CTX为您希望提供的每个单独的证书提供单独的证书。

其他新的 5.6 TLS 功能

在即将发布的 PHP 5.6 版本中,除了 SNI 支持之外,还有很多针对加密服务器的 SSL/TLS 改进。您可以在此处阅读其中的一些内容:

于 2014-02-25T03:59:33.057 回答