PHP服务器端SNI支持

时间:2014-01-01 03:29:13

标签: php ssl https php-openssl

我阅读了很多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

1 个答案:

答案 0 :(得分:6)

是的,服务器端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" SSL上下文选项映射主机名 如果客户握手通告SNI,则需要适当的证书 能力。
  • 如果是客户端,前缀*.将使用匹配的证书 请求主要主机名或其任何子域。所以 在上面的示例中,我们的 domain2.pem 将同时用于 请求 domain2.com subdomain.domain2.com
  • "SNI_server_certs" ctx选项对客户端无效 流。
  • 对于两台服务器,默认情况下启用SNI支持,版本为5.6 和客户。服务器必须指定"SNI_server_certs"数组 但实际上使用SNI扩展名。
  • 如果还传递了"SNI_enabled" => false ctx选项 "SNI_server_certs"数组无效。
  • 虽然支持SNI本身就足以成功 与许多客户协商TLS握手,服务器必须 仍指定"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改进相当多。你可以在这里阅读其中的一些内容: