浏览器和工具是否默认发送“SNI”字段连接到 https 端点?

信息安全 tls 网页浏览器 卷曲 代理服务器
2021-09-05 11:23:56

我在tcp没有 SSL/TLS 终止的情况下以直通 () 模式为 https 设置 HaProxy。我希望能够根据客户端请求的主机名将流量路由到不同的后端。

从 HaProxy 文档中,我了解到SNI可以使用未加密的字段来设置ACL规则。

我的问题是:大多数浏览器支持的SNI功能,默认发送这个字段吗?其他工具是否也喜欢curlwget发送它?

2个回答

所有现代浏览器都支持 SNI 并默认使用它(可能甚至没有关闭它的方法)。大多数工具(如 curl)的当前版本默认也使用 SNI,但不是全部。例如,使用openssl s_client*您需要明确指定-servername ...是否要使用 SNI,并且在某些编程语言中,仅当您使用更高级别的 HTTP 库而不是仅使用较低级别的 TLS 绑定时才默认使用 SNI。

有关更多信息,另请参阅SSLLabs:用户代理功能


* openssl 1.1.0 改变了行为。从那时起,默认情况下 SNI 处于启用状态,但可以使用-noservername.

是的,TLS 客户端发送 SNI,并且不发送 SNI 的工具预计将无法工作(例如,python 早于 2.7.8),因为许多站点只使用 SNI。

例如,任何使用 CDN 都需要 SNI(除非您在 CDN 提供商处为您的域支付专用 IPv4 地址,这非常昂贵)。

许多确实有专用 IPv4 地址的站点被配置为丢弃非 SNI 连接或为非 SNI 连接提供虚拟证书。

因此,您只需声明您的站点需要 SNI 就可以了(除非您必须保持与旧客户端的兼容性,它们几乎肯定不安全并且不应该使用)。

您应该知道的一件事是 HTTP/2 请求多路复用和涵盖多个域的 TLS 证书的怪癖。如果浏览器需要对 foo.com 执行请求并打开与您的服务器的连接并在 SAN 中获取 foo.com 和 bar.com 的证书,并且不久之后同一浏览器需要对 bar.com 执行请求并且 DNS 说它是相同的 IP 地址,因为证书也涵盖了 bar.com,它会认为已经打开的与 foo.com 的连接是合适的,并且只是在单个 HTTP/2 连接中多路复用对 bar.com 的请求。如果您的后端“知道”对 bar.com 的请求无法到达此服务器,因为 SNI 中与 bar.com 的连接被移交给了另一台服务器,那么您将遇到错误。