测试 URL 是否需要 SNI

Testing if a URL requires SNI

我有 a site which is served over HTTPS, but which iTunes can't find. My suspicion is that it's related to the iTunes backend server being Java 6, and Java 6 not supporting SNI. SSL Labs seems to hint that my site does require SNI (see this report,并搜索 SNI),但我想不出为什么。我误解了多域证书吗?我在同一台服务器上有多个站点 运行,但我的理解是,只要所有 URL 都列为证书上的主题备用名称,一切都会好起来的。

有谁知道检查 URL 是否需要客户端支持 SNI 才能访问它的好方法?我没有 Windows XP/Java 6 可悲地安装。

SSLLabs 关于 SNI 的报告通常是正确的。如果您的证书包含所有可能的主机,您对 SNI 的理解也是正确的。但是,理论上不需要并不意味着您的服务器设置无论如何都不需要 SNI。

I don't have a Windows XP/Java 6 install around to play with sadly.

鉴于您只指定了您没有的东西,我将假设您拥有可能使用的所有其他东西。一种简单的检查方法是 openssl:

 # without SNI
 $ openssl s_client -connect host:port 

 # use SNI
 $ openssl s_client -connect host:port -servername host

比较 openssl s_client 的两次调用的输出。如果它们所服务的证书不同,或者如果调用 w/o SNI 无法建立 SSL 连接,那么您需要 SNI 才能获得正确的证书或根本无法建立 SSL 连接。

Nginx 一般而言,尤其是您的站点,接受但不需要 SNI。要对此进行测试,您不能直接使用 Oracle Java,因为它的 cacerts 不包括 DST Root CA X3 这是使用的根证书(最初)由颁发您站点证书的“Let's Encrypt”使用;对于当前 (8u74) 之前的所有 Oracle Java 版本都是如此。 Windows(因此 IE 和 Windows 上的 Chrome)和 Firefox 确实有这个根证书;我不能说其他 OS 或浏览器。

要解决此问题以便您轻松测试,可以:

  • 使用 Oracle Java 6 但修改 JRE/lib/security/cacerts 以添加 DSTX3 证书,该证书可以从您的 OS 或浏览器获得,也可以按照 link at https://letsencrypt.org/certificates/ to https://www.identrust.com/certificates/trustid/root-download-x3.html -- 除了该页面非标准地只给你证书的 base64 body 所以你必须在 Java 之前手动添加 PEM header 和尾行 keytool 将导入它。

  • 使用 Oracle Java 6 as-is 但将您的应用程序(使用系统属性)配置为使用您创建的包含上述 DSTX3 证书的自定义信任库。

  • 使用在 cacerts 中包含此根证书的 Java6 版本。特别是我使用 CentOS 6 及其 openjdk 包(用于 6、7 和 8)使用包含 DSTX3 的系统范围 CA 'bundle',这使我可以轻松地进行此测试。我预计,但无法确认,其他 RedHat 变体是否也这样做。对于其他发行版和平台我不能说;如果没有,请参阅上文。

使用wireshark或类似工具监控连接尝试,可以看到ClientHello不包含SNI,但连接成功并成功用于HTTP请求。

如果您真的想与服务器通信而不是测试 SNI,只需省略最后的 'monitor' 步骤。

检查站点是否依赖 SNI 的简单方法是:

openssl s_client -servername alice.sni.velox.ch -tlsextdebug -msg \
    -connect alice.sni.velox.ch:443 2>/dev/null | grep "server name"

如果您在该输出中看到以下内容,则表示该站点正在使用 SNI。

TLS server extension "server name" (id=0), len=0

以上是an answer at serverfault的总结。