我正在寻找一种简单的方法来了解服务器是否正在使用服务器名称指示SSL扩展名作为其网站上的HTTPS证书。使用浏览器或Unix命令行的方法是可以的。
谢谢!
发布于 2013-05-09 09:37:51
SNI是由客户端发起的,因此您需要一个支持它的客户机。除非您使用的是windows,否则您的浏览器就可以了。如果您的客户端允许您正确地调试SSL连接(不幸的是,即使是gnutls/openssl命令也不能),那么您可以看到服务器是否在扩展的hello中返回一个server_name字段。请注意,缺少此字段只意味着服务器在客户端hello中没有使用server_name来帮助选择证书,而不是它不支持证书。
因此,在实践中,最简单的测试就是简单地尝试连接。为此,您需要知道两个解析到同一个IP的名称,可以对其建立ssl连接。https是最简单的,因为您可以简单地浏览到这两个名称,并查看您是否获得了正确的证书。
有三项成果:
一个稍微复杂的测试,将产生更多的信息,是让wireshark打开和捕获时,浏览。然后,您可以通过过滤ssl.handshake找到相关的数据包。下面的屏幕截图是一个支持SNI的客户机hello/server hello对的示例:


当然,服务器hello中没有server_name字段并不表示不支持SNI。仅仅是客户端提供的server_name没有用于决定使用哪个证书。
发布于 2016-06-01 20:34:15
您可能需要的用于检测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 (参见S_客户(1))连接到www.YOURSERVER.com on 443上的服务器。-tlsextdebug选项打开TLS扩展调试输出。-servername选项告诉s_client程序在TLS握手时将www.SERVERNAME.com作为ClientHello数据包中SNI字段的值传递。
最后,2>/dev/null简单地隐藏了stderr输出(可以是噪声),而| grep "server name"管道过滤标准以在s_client的S TLS扩展调试输出中显示称为“服务器名”的TLS扩展。
如果您看到一行输出,如
TLS server extension "server name" (id=0), len=0然后,服务器在其ServerHello响应中返回SNI报头信息。如果您不支持,那么服务器要么不支持SNI,要么没有配置为返回SNI信息,给出您所要求的名称。在这种情况下,请再次检查您是否在-servername选项中使用域名,服务器应该响应该域名的信息。
发布于 2015-05-15 17:52:06
您可以使用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.chhttps://serverfault.com/questions/506177
复制相似问题