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

spo*_*key 47 ssl https sni

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

谢谢!

小智 35

您可能正在寻找的用于检测 SSL/TLS Server Name Indication 扩展标头存在的衬垫是:

openssl s_client -servername www.SERVERNAME.com -tlsextdebug -connect www.YOURSERVER.com:443 2>/dev/null | grep "server name"
Run Code Online (Sandbox Code Playgroud)

www.SERVERNAME.com您正在测试的 SNI 值在哪里?是您正在测试www.YOURSERVER.com的支持 TLS 的服务器的域名或 IP 地址。

命令行使用openssl's s_client(请参阅s_client(1)www.YOURSERVER.com在端口 上连接到服务器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
Run Code Online (Sandbox Code Playgroud)

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


Den*_*ker 25

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 对示例:

客户你好 服务器你好

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

  • Dennis - 不同意 `openssl`。一些详细信息可用:`openssl s_client -servername alice.sni.velox.ch -tlsextdebug -msg -connect alice.sni.velox.ch:443` Qualys [SSL 测试](https: //www.ssllabs.com/ssltest/)。 (10认同)