【问题标题】:PHP server-side SNI supportPHP 服务器端 SNI 支持
【发布时间】:2014-01-18 20:37:23
【问题描述】:

我阅读了很多 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编写的HTTP服务器,它接受SSL请求?你能告诉我们你为什么要做这样的事吗?
  • @Charles:透明代理服务器。我有很多用纯 PHP 编写的服务器(但其中大多数是非 http 的)。如果您知道如何使用它,这是非常好的语言;)
  • 优秀的建筑师也知道何时使用钉锤、大锤和手提钻来完成不同的工作。 :) PHP 是您尝试完成的工作的错误工具。此外,看起来像support would have to be expressly present at the C level 让 OpenSSL 支持 SNI 服务器端,并且不清楚如何将该功能公开给 PHP 套接字......

标签: php ssl https php-openssl


【解决方案1】:

是的,PHP >= 5.6 中提供服务器端 SNI 支持

示例用法:

$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" => 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 新功能

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

【讨论】:

    猜你喜欢
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 2011-08-18
    相关资源
    最近更新 更多