我阅读了很多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
答案 0 :(得分: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"
SSL上下文选项映射主机名
如果客户握手通告SNI,则需要适当的证书
能力。*.
将使用匹配的证书
请求主要主机名或其任何子域。所以
在上面的示例中,我们的 domain2.pem 将同时用于
请求 domain2.com 和 subdomain.domain2.com "SNI_server_certs"
ctx选项对客户端无效
流。"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功能
在SNI支持之后的即将发布的PHP 5.6版本中,加密服务器的SSL / TLS改进相当多。你可以在这里阅读其中的一些内容: