如何检测服务器是否使用SNI进行HTTPS?

我正在寻找一种简单的方法来知道服务器是否在网站上使用服务器名称指示SSL扩展作为其HTTPS证书。 一个使用浏览器或Unix命令行的方法是好的。

谢谢!

SNI是由客户端发起的,所以你需要一个支持它的客户端。 除非你在Windows XP上,否则你的浏览器就可以。 如果您的客户端允许您正确debuggingSSL连接(不幸的是,即使是gnutls / openssl CLI命令也不会),您可以看到服务器是否在扩展的hello中发送了一个server_name字段。 请注意,缺less此字段仅意味着服务器没有在客户端hello中使用server_name来帮助select证书,而不是它不支持它。

所以,在实践中,最简单的testing就是简单地尝试连接。 为此,您需要知道两个parsing为相同IP的名称,可以对其进行ssl连接。 HTTPS是最简单的,你可以简单地浏览到这两个名字,看看你是否提供了正确的证书。

有三个结果:

  • 你会得到一个包含两个名字的通配符证书(或者一个带有subjectAltName的证书):你什么都不学
  • 您至less得到了其中一个错误的证书:服务器不支持SNI或configuration错误
  • 您会得到两个不同的证书,都是正确的名称:SNI支持并正确configuration。

产生更多信息的稍微复杂的testing是在浏览时打开Wireshark并捕获。 然后,您可以通过过滤ssl.handshake来查找相关的数据包。 以下屏幕截图是支持SNI的客户端hello / server hello对的示例:

客户你好服务器你好

同样,服务器hello中缺lessserver_name字段并不表示不支持SNI。 仅仅是在决定使用哪个证书时,并没有使用客户端提供的server_name。

您可能正在寻找检测SSL / TLS服务器名称指示扩展头的存在的一个class轮是:

 openssl s_client -servername www.SERVERNAME.com -tlsextdebug -connect www.YOURSERVER.com:443 2>/dev/null | grep "server name" 

其中www.SERVERNAME.com是您正在testing的SNI值, www.SERVERNAME.com是您正在testing的支持TLS的服务器的域名或IP地址。

命令行使用openssls_client (请参阅s_client(1) )通过端口443连接到www.YOURSERVER.com上的服务器。 -tlsextdebug选项打开TLS扩展debugging输出。 -servername选项告诉s_client程序在TLS握手期间传递www.SERVERNAME.com作为ClientHello数据包中的SNI字段的值。

最后, 2>/dev/null简单地隐藏stderr输出(可以是嘈杂的),并且| grep "server name" | grep "server name"pipe道过滤标准输出以在s_client的TLS扩展debugging输出中显示名为“服务器名称”的TLS扩展。

如果你看到一行输出如

 TLS server extension "server name" (id=0), len=0 

那么服务器将在其ServerHello响应中返回SNI头信息。 如果您不这样做,那么服务器可能不支持SNI,或者它没有被configuration为根据您要求的名称返回SNI信息。 在这种情况下,请仔细检查您是否正在使用服务器应以SNI信息回应的-servername选项中的域名。

您可以使用openssl来获取和查询证书。

  • openssl s_client -connect获取证书
  • openssl x509parsing证书
  • grepfind“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