为什么SSL测试结果会显示两个RSA证书?

虚竹 2018-4-18 2864

症状
比如在检测 www.appnode.com 的 ssl 证书状态时,myssl 返回的结果如下:



不少用户会问,为什么会返回第二个证书,不明真相的用户甚至还会怀疑我们在搞鬼。

原因解析

首先,介绍一个名词:SNI
QuoteSNI (Server Name Indication)是用来改善服务器与客户端 SSL (Secure Socket Layer)和 TLS (Transport Layer Security) 的一个扩展。主要解决一台服务器只能使用一个证书(一个域名)的缺点,随着服务器对虚拟主机的支持,一个服务器上可以为多个域名提供服务,因此SNI必须得到支持才能满足需求。

没有 SNI 机制之前,如果一台服务器上有多个 https 站点,就需要多个 IP,每个 IP 上绑定一个对应网站的 SSL 证书。
有 SNI 机制后,可以在同一个 IP 下绑定多个证书,但是客户端在请求时需要先带上域名,这样服务端才能找到对应的 SSL 证书。

上面截图中的两个结果,其实是在支持 SNI 和不支持 SNI 的客户端中的测试结果。
图 2 中的信任状态后面也明确标明了“主流浏览器访问不受影响,影响少数不支持SNI的旧浏览器”。
现在大部分浏览器都支持 SNI,因此这项结果完全是可以忽略的。

怎么让检测结果中第二个证书消失

如上文分析,检测结果中的第二个证书,只是在不支持 SNI 的客户端上出现的。
如果你的服务器上只打算建一个 https 网站,可以用以下办法解决:点击“默认网站”,禁用 https 端口(如443)上的默认网站,重载Nginx服务。
这样做的结果是,你的服务器上有且最多只能有一个 https 网站,除非你有多 IP。

深入学习(模拟浏览器)

模拟支持SNI的浏览器获取到的证书,使用以下命令测试:
Quoteopenssl s_client -connect www.appnode.com:443 -servername www.appnode.com -showcerts

模拟不支持SNI的浏览器获取到的证书,使用以下命令测试:
Quoteopenssl s_client -connect www.appnode.com:443
最新回复 (0)
返回
发新帖