我阅读了很多 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
我阅读了很多 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
示例用法:
$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.com和subdomain.domain2.com的请求"SNI_server_certs"
客户端流没有影响。"SNI_server_certs"
数组才能实际使用 SNI 扩展。"SNI_enabled" => false
还传递了 ctx 选项,则该"SNI_server_certs"
数组无效。"local_cert"
ctx 选项,否则将面临来自不支持 SNI 扩展的客户端连接失败的风险。在 PHP 5.6 之前,服务器端 SNI 是不可能的...
这是因为加密的 PHP 服务器目前仅在内部使用单个 OpenSSL SSL_CTX
C 结构。在服务器中部署 SNI 需要SSL_CTX
为您希望提供的每个单独的证书提供单独的证书。
其他新的 5.6 TLS 功能
在即将发布的 PHP 5.6 版本中,除了 SNI 支持之外,还有很多针对加密服务器的 SSL/TLS 改进。您可以在此处阅读其中的一些内容: