Answers:
SNI由客户端启动,因此您需要一个支持它的客户端。除非您使用的是Windows XP,否则您的浏览器就可以。如果您的客户端允许您正确调试SSL连接(不幸的是,即使gnutls / openssl CLI命令也无法调试),则可以查看服务器是否在扩展的hello中发回了server_name字段。请注意,缺少此字段仅表示服务器未在客户端问候中使用server_name来帮助选择证书,而不是它不支持该证书。
因此,实际上,最简单的测试就是简单地尝试连接。为此,您需要知道两个可以解析为同一IP的名称,可以建立ssl连接。https是最简单的,因为您可以然后浏览至两个名称并查看是否获得了正确的证书。
有三个结果:
一个稍微复杂一点的测试将产生更多的信息,即在浏览时打开并捕获wireshark。然后,可以通过过滤ssl.handshake来找到相关的数据包。下面的屏幕快照是支持SNI的客户端问候/服务器问候对的示例:
同样,当然,服务器问候中不存在server_name字段并不表示不支持SNI。只是在决定使用哪个证书时未使用客户端提供的server_name。
您可能需要用来检测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_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_client
TLS扩展调试输出中显示称为“服务器名称” 的TLS扩展。
如果看到一行输出,例如
TLS server extension "server name" (id=0), len=0
服务器将在其ServerHello响应中返回SNI标头信息。如果您不这样做,则可能是服务器不支持SNI或未将其配置为根据您要求的名称返回SNI信息。在这种情况下,请-servername
在服务器应以SNI信息作为响应的选项中仔细检查您是否正在使用域名。
-servername
。-servername sdfsdlkfjsdf23.somedomain.somewhere -connect realhost.somedomain.somewhere
= TLS server extension "server name" (id=0), len=0
(如果它们匹配,则输出相同。)如何验证它与输出中服务器上的主机不匹配?
-msg
除了上面的参数和grep的“ Alert”之外,您还需要传递。如果-servername
错误,您将从TLS 1.2 Alert ... warning unrecognized_name
服务器获得类似信息。@Meitar我认为如果您将其添加到答案中将对其他人有用。
-msg
开关仅添加TLS协议消息的十六进制转储。不需要观察到TLS握手错误,因此添加到此答案将是不正确的。而且,这样的TLS握手错误会打印到STDOUT,这意味着2>/dev/null
将需要从答案中删除,以便首先对其进行处理grep
。@bshea实际上要求的是“如何检测TLS错误?” 与“此服务器是否使用TLS协议的SNI功能?”这个问题完全不同。这是这里的主题。
STDERR
到文本文件,也不会在该位置出现该错误。没有-msg
我,我找不到其他显示握手消息的选项。(使用openssl 1.0.2q)。只要与答案相关,您可能是对的。
您可以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
DNS:...
最后一行的条目显示所有证书在有效SNI名。
openssl
。可以使用一些详细信息:openssl s_client -servername alice.sni.velox.ch -tlsextdebug -msg -connect alice.sni.velox.ch:443
在Qualys SSL测试期间会给出使用SNI的一些指示。