测试URL是否需要SNI

时间:2016-02-25 22:15:53

标签: ssl sni

我有a site这是通过HTTPS提供的,但iTunes无法找到。我怀疑它与iTunes后端服务器是Java 6有关,而Java 6则不支持SNI。 SSL实验室似乎暗示我的网站确实需要SNI(参见this report,并搜索SNI),但我想不出原因。我误解了多域证书吗?我在同一台服务器上运行了多个站点,但我的理解是,只要所有的URL都在证书上列为主题备用名称,那一切都会很好。

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

3 个答案:

答案 0 :(得分: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连接。

答案 1 :(得分:3)

检查网站是否依赖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

以上是an answer at serverfault的摘要。

答案 2 :(得分:2)

一般而言,Nginx,特别是您的网站,接受但不要求SNI。要对此进行测试,您无法轻易使用 Oracle Java ,因为其cacerts 不包含 DST Root CA X3 根使用证书(最初)通过“让我们加密”'谁签发了您的网站证书;对于当前所有版本的Oracle Java(8u74)都是如此。 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主体,因此您必须在Java keytool导入之前手动添加PEM标题和预告行。

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

  • 使用在cacerts中包含此根证书的Java 6版本。特别是我使用CentOS 6及其openjdk软件包(6,7和8)使用系统范围的CA''包括DSTX3,这使我很容易进行这项测试。我希望,但无法证实,其他RedHat变种也是如此。对于其他发行版和平台,我不能说;如果没有,请参见上文。

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

如果您确实想要与服务器进行通信而不是针对SNI进行测试,那么只需省略最终的“监视器”即可。步骤