我有a site这是通过HTTPS提供的,但iTunes无法找到。我怀疑它与iTunes后端服务器是Java 6有关,而Java 6则不支持SNI。 SSL实验室似乎暗示我的网站确实需要SNI(参见this report,并搜索SNI),但我想不出原因。我误解了多域证书吗?我在同一台服务器上运行了多个站点,但我的理解是,只要所有的URL都在证书上列为主题备用名称,那一切都会很好。
有没有人知道检查URL是否需要客户端上的SNI支持来访问它的好方法?我没有安装Windows XP / Java 6,可悲地玩。
答案 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进行测试,那么只需省略最终的“监视器”即可。步骤