PHP 服务器端 SNI 支持



我阅读了很多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.comsubdomain.domain2.com
  • "SNI_server_certs"ctx 选项对客户端没有影响 流。
  • 从 5.6 开始,默认情况下为两台服务器启用 SNI 支持 和客户。服务器必须指定"SNI_server_certs"阵列 不过,实际使用 SNI 扩展。
  • 如果还传递了"SNI_enabled" => falsectx 选项,则"SNI_server_certs"数组不起作用。
  • 虽然支持SNI本身就足以成功 与许多客户端协商TLS握手,服务器必须 仍指定"local_cert"CTX 选项或冒 不支持 SNI 的客户端的连接失败 外延。

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

这是因为加密的PHP服务器目前在内部只使用单个OpenSSLSSL_CTXC结构。在服务器中部署 SNI 需要对要提供的每个证书进行单独的SSL_CTX

其他新的 5.6 TLS 功能

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

  • [RFC] 改进了 TLS 默认值
  • PHP 5.6 新闻文件

最新更新