我阅读了很多php手册页,但只在上下文中找到了有关SNI支持的信息 - http://www.php.net/manual/en/context.ssl.php
当PHP作为服务器工作时,是否可以通过浏览器获取SNI发送?服务器是使用标准 stream_socket_server() 创建的,如 eg.这篇文章: http://www.php.net/manual/en/function.stream-socket-server.php#98616
,服务器端 SNI 支持在 PHP 中可用>= 5.6
- 如果你有兴趣,这里是相关的提交github。
示例用法:
$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 选项对客户端没有影响 流。- 从 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服务器目前在内部只使用单个OpenSSLSSL_CTX
C结构。在服务器中部署 SNI 需要对要提供的每个证书进行单独的SSL_CTX
。
其他新的 5.6 TLS 功能
在即将发布的 PHP 5.6 版本中,除了 SNI 支持之外,还有相当多的加密服务器的 SSL/TLS 改进。您可以在此处阅读其中的一些内容:
- [RFC] 改进了 TLS 默认值
- PHP 5.6 新闻文件