如何检测服务器是否将SNI用于HTTPS?


41

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

谢谢!

Answers:


20

SNI由客户端启动,因此您需要一个支持它的客户端。除非您使用的是Windows XP,否则您的浏览器就可以。如果您的客户端允许您正确调试SSL连接(不幸的是,即使gnutls / openssl CLI命令也无法调试),则可以查看服务器是否在扩展的hello中发回了server_name字段。请注意,缺少此字段仅表示服务器未在客户端问候中使用server_name来帮助选择证书,而不是它不支持该证书。

因此,实际上,最简单的测试就是简单地尝试连接。为此,您需要知道两个可以解析为同一IP的名称,可以建立ssl连接。https是最简单的,因为您可以然后浏览至两个名称并查看是否获得了正确的证书。

有三个结果:

  • 您将获得包含两个名称的通配符证书(或带有subjectAltName的通配符证书):您一无所知
  • 您为至少其中之一获得了错误的证书:服务器不支持SNI或配置错误
  • 您将获得两个不同的证书,两个证书的名称均正确:SNI受支持且配置正确。

一个稍微复杂一点的测试将产生更多的信息,即在浏览时打开并捕获wireshark。然后,可以通过过滤ssl.handshake来找到相关的数据包。下面的屏幕快照是支持SNI的客户端问候/服务器问候对的示例:

客户您好 服务器你好

同样,当然,服务器问候中不存在server_name字段并不表示不支持SNI。只是在决定使用哪个证书时未使用客户端提供的server_name。


9
丹尼斯-反对openssl。可以使用一些详细信息:openssl s_client -servername alice.sni.velox.ch -tlsextdebug -msg -connect alice.sni.velox.ch:443在Qualys SSL测试期间会给出使用SNI的一些指示。
鹿猎人(

啊,我在手册页中错过了。感谢您的添加。
丹尼斯·考斯玛克

26

您可能需要用来检测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地址。

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

最后,2>/dev/null仅隐藏stderr输出(可能会有噪音),并且| grep "server name"管道过滤器stdout可以在s_clientTLS扩展调试输出中显示称为“服务器名称” 的TLS扩展。

如果看到一行输出,例如

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

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


1
无论是否使用正确,输出都是相同的-servername-servername sdfsdlkfjsdf23.somedomain.somewhere -connect realhost.somedomain.somewhere= TLS server extension "server name" (id=0), len=0(如果它们匹配,则输出相同。)如何验证它与输出中服务器上的主机不匹配?
bshea

1
@bshea -msg除了上面的参数和grep的“ Alert”之外,您还需要传递。如果-servername错误,您将从TLS 1.2 Alert ... warning unrecognized_name服务器获得类似信息。@Meitar我认为如果您将其添加到答案中将对其他人有用。
Viktor Nonov

@ViktorNonov -msg开关仅添加TLS协议消息的十六进制转储。不需要观察到TLS握手错误,因此添加到此答案将是不正确的。而且,这样的TLS握手错误会打印到STDOUT,这意味着2>/dev/null将需要从答案中删除,以便首先对其进行处理grep。@bshea实际上要求的是“如何检测TLS错误?” 与“此服务器是否使用TLS协议的SNI功能?”这个问题完全不同。这是这里的主题。
Meitar

@Meitar,我找不到观察TLS握手消息的另一种方法。另外,即使我将重定向STDERR到文本文件,也不会在该位置出现该错误。没有-msg我,我找不到其他显示握手消息的选项。(使用openssl 1.0.2q)。只要与答案相关,您可能是对的。
维克多·诺诺夫

-2

您可以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

我在该输出中寻找什么?存在多个域的事实?
spookylukey 2015年

DNS:... 最后一行的条目显示所有证书在有效SNI名。
spazm

4
证书中的SAN和服务器上的SNI支持是不同的东西,SAN在HTTPS虚拟主机上的使用是SNI之前的黑客。对于SNI,您不需要带有SAN的证书,因为服务器能够选择与客户端命名期望匹配的单个证书。
mr.spuratic
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.