测试网址是否需要 SNI

  • 本文关键字:SNI 是否 测试 ssl sni
  • 更新时间 :
  • 英文 :


我有一个通过HTTPS提供的网站,但iTunes找不到。我怀疑这与iTunes后端服务器是Java 6有关,而Java 6不支持SNI。SSL Labs似乎暗示我的网站确实需要SNI(请参阅此报告,并搜索SNI),但我想不出为什么。我是否误解了多域证书?我在同一台服务器上运行多个站点,但我的理解是,只要所有 URL 都列为证书上的主题备用名称,一切都会好起来的。

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

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

遗憾的是,我没有安装Windows XP/Java 6可以玩。

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

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

比较 openssl s_client 的两个调用的输出。如果它们提供的证书不同,或者没有 SNI 的调用无法建立 SSL 连接,则需要 SNI 才能获得正确的证书或建立 SSL 连接。

检查网站是否依赖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 服务器扩展"服务器名称"(id=0),len=0

以上是服务器故障答案的摘要。

一般来说,Nginx,特别是你的网站,接受但不需要SNI。要测试这一点,您不能轻易地使用开箱即用的Oracle Java,因为它cacerts不包括DST Root CA X3哪个是颁发您站点证书的"Let's Encrypt"(最初)使用的根证书;对于当前(8u74)之前的所有Oracle Java版本都是如此。Windows(因此Windows上的IE和Chrome)和Firefox确实有这个根证书;我不能说其他操作系统或浏览器。

要解决此问题以便您可以轻松测试,请执行以下任一操作:

  • 使用 Oracle Java 6 但修改JRE/lib/security/cacerts以添加 DSTX3 证书,该证书可从操作系统或浏览器获取,或者通过 https://letsencrypt.org/certificates/到 https://www.identrust.com/certificates/trustid/root-download-x3.html 中的链接获得 - 除了该页面非标准地仅为您提供证书的 base64 正文,因此您必须手动添加 PEM 标头和尾部行,然后 Java keytool 才会导入它。

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

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

使用 wireshark 或类似方法监视连接尝试,以查看 ClientHello 不包含 SNI,但连接成功并成功用于 HTTP 请求。

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

最新更新