什么是 SNI 孔?

信息安全 tls 术语
2021-09-03 19:23:43

今天早些时候,Lone Learner 询问为什么访问 google.net 时没有证书错误,尽管它提供了颁发给 google.com 的证书?

接受的答案说明问题是由SNI Hole引起的。

你掉进了一个“SNI 洞”。如果客户端的 TLS 握手部分中没有提供“服务器名称指示”,Google 将提供不同的证书。
- StackzOfZtuff

“什么是 SNI漏洞”的顶部搜索结果是关于在 Web 服务器上启用 SNI 漏洞的安全隐患是什么的问题页面,这对于不熟悉该术语的人来说并没有多大帮助。

SNI 孔到底是什么?

3个回答

SNI(服务器名称指示)是一种 TLS(传输层安全)扩展,其中客户端在 TLS 握手中向服务器提供它想要访问的目标的域名。它用于在同一 IP 地址上有多个具有不同证书的虚拟服务器的情况下,以便服务器可以提供正确的证书。

到目前为止,它类似于 HTTP 请求中的 HTTP 主机头,用于选择匹配的虚拟主机配置 - 只有 Host 头不能用于选择证书,因为它是在HTTP 请求内部发送的。(即在 TLS 握手已经完成之后)。

由于 SNI TLS 扩展是可选的,因此某些客户端可能不会发送此扩展。openssl s_client没有参数的情况就是这种情况-servername,但不同编程语言的许多 TLS 库也是如此。虽然所有现代浏览器都使用 SNI,但 XP 上的 IE8 等较旧的浏览器不使用它。

如果这样的客户端连接到具有多个证书的服务器,服务器不知道客户端实际需要哪个证书,即客户端因不使用SNI扩展而落入“SNI洞”。在这种情况下,服务器通常要么发回错误(或者有时只是关闭连接),要么使用为此目的显式或隐式配置的默认证书。

SNI 漏洞是指您为 IP 地址设置的默认站点不需要存在 SNI 即可完成 HTTPS 连接。

事实上,这就是所有HTTPS 连接在 SNI 存在之前的工作方式。每个 HTTPS 站点都需要一个可路由的 IP 地址,而不仅仅是主机名。因此,当以这种方式设置时,对该 IP 地址的任何端口 443 请求都将解析到该站点,即使您有许多使用虚拟主机名的 HTTP(端口 80)站点也是如此。对于为多个站点重复使用网络服务器,然后决定为其中一个站点设置 SSL/HTTPS 的人来说,这是一个长期存在的问题。如果你正在运行http://example.comhttp://contoso.com在同一台服务器上,然后设置HTTPS的example.com,对于结果http://contoso.com还是会正常工作,但要求https://contoso.com将返回结果https://example.com,尽管有证书错误。

你在这里看到的实际上是同一件事。如果您不发送 SNI 扩展程序告诉 Google 的服务器您尝试连接的主机名,则 Google 网络服务器 IP 地址的默认值是google.com站点,因此无论您尝试连接哪个主机名,它将是google.com那会回应的。

您联系了一个 SNI 服务器,该服务器实际上有多个 SSL 域和一个非 SNI 客户端。服务员猜错了。

使用 HTTP/1.0 客户端联系 HTTP/1.1 服务器时的基本情况相同。服务器猜测。