我正在寻找一种简单的方法来了解服务器是否在网站上使用服务器名称指示 SSL 扩展作为其 HTTPS 证书。使用浏览器或 Unix 命令行的方法都可以。
谢谢!
答案1
SNI 由客户端发起,因此您需要一个支持它的客户端。除非您使用的是 Windows XP,否则您的浏览器就可以了。如果您的客户端允许您正确调试 SSL 连接(遗憾的是,甚至 gnutls/openssl CLI 命令也不支持),您可以查看服务器是否在扩展的 hello 中发回了 server_name 字段。请注意,缺少此字段仅表示服务器未使用客户端 hello 中的 server_name 来帮助选择证书,而不是表示它不支持它。
因此,实际上最简单的测试就是尝试连接。为此,您需要知道两个解析到相同 IP 的名称,以便可以建立 SSL 连接。https 最简单,因为您可以直接浏览这两个名称,看看是否显示了正确的证书。
有三种结果:
- 您将获得一个涵盖两个名称的通配符证书(或具有 subjectAltName 的证书):您什么也学不到
- 您至少获得了其中一个错误的证书:服务器不支持 SNI,或者配置错误
- 您将获得两个不同的证书,它们的名称都是正确的:SNI 受支持且配置正确。
一个稍微复杂一些的测试将产生更多信息,即在浏览时打开 wireshark 并进行捕获。然后,您可以通过过滤 ssl.handshake 来找到相关的数据包。以下屏幕截图是支持 SNI 的客户端 hello/服务器 hello 对的示例:
再次强调,服务器问候中缺少 server_name 字段当然并不表示不支持 SNI。只是表示在决定使用哪个证书时未使用客户端提供的 server_name。
答案2
您可能正在寻找的用于检测 SSL/TLS 服务器名称指示扩展标头是否存在的一行代码是:
openssl s_client -servername www.SERVERNAME.com -tlsextdebug -connect www.YOURSERVER.com:443 2>/dev/null | grep "server name"
其中www.SERVERNAME.com
,是您正在测试的 SNI 值,www.YOURSERVER.com
是您正在测试的支持 TLS 的服务器的域名或 IP 地址。
命令行使用openssl
's s_client
(参见客户端(1)) 连接到www.YOURSERVER.com
端口上的服务器443
。该-tlsextdebug
选项打开 TLS 扩展调试输出。该-servername
选项告诉程序在 TLS 握手期间作为 ClientHello 数据包中 SNI 字段的值s_client
传递。www.SERVERNAME.com
最后,2>/dev/null
简单地隐藏 stderr 输出(可能会很嘈杂),管道过滤 stdout 以在TLS 扩展调试输出| grep "server name"
中显示名为“服务器名称”的 TLS 扩展。s_client
如果你看到如下输出
TLS server extension "server name" (id=0), len=0
那么服务器将在其 ServerHello 响应中返回 SNI 标头信息。如果没有,则可能是服务器不支持 SNI,或者尚未配置为根据您要求的名称返回 SNI 信息。在这种情况下,请仔细检查您在选项中使用的域名是否是-servername
服务器应使用 SNI 信息进行响应的域名。
答案3
您可以使用openssl
来获取和查询证书。
- 使用以下方式获取证书
openssl s_client -connect
- 解析证书
openssl x509
grep
查找“DNS:”信息
openssl s_client -connect alice.sni.velox.ch:443 | openssl x509 -noout -text | grep DNS:
% openssl s_client -connect alice.sni.velox.ch:443 | openssl x509 -noout -text | grep DNS:
depth=2 C = BM, O = QuoVadis Limited, CN = QuoVadis Root CA 2
verify return:1
depth=1 C = BM, O = QuoVadis Limited, CN = QuoVadis Global SSL ICA G2
verify return:1
depth=0 C = CH, ST = Zuerich, L = Zuerich, O = Kaspar Brand, CN = alice.sni.velox.ch
verify return:1
DNS:alice.sni.velox.ch, DNS:carol.sni.velox.ch
最后一行显示证书中存在的所有 SNI 条目:
DNS:alice.sni.velox.ch, DNS:carol.sni.velox.ch