1

我希望我在正确的地方问这个问题,它关于对 SNI 的理解

根据https://devcentral.f5.com/articles/ssl-profiles-part-7-server-name-indication#.U5wEnfmSzOz “引入SNI,客户端可以指明自己所在的服务器的名称尝试在握手过程中作为“客户端问候”消息的一部分进行连接”

我的问题是像浏览器这样的客户端或任何 HTTP 客户端(比如 java.net)如何在 CLIENT HELLO 中发送此服务器名称?客户端是自己做的还是你必须以编程方式将它添加到 https 请求(例如如何在 JAVA.net HttpsURLConnection 中)

从http://www.ietf.org/rfc/rfc4366.txt读取 “目前,唯一支持的服务器名称是 DNS 主机名”,因此主机名是 SNI 兼容客户端发送的 server_name 或客户端可以发送的任何其他名称..

我希望我很清楚,如果不清楚,请改进问题/措辞,或者如果不清楚,请告诉我谢谢

4

1 回答 1

2

如果您使用的是 https 库,您可以给它一个 URL,该库将为您获取该 URL 的内容,那么添加 SNI 支持的简洁方法是完全在库中执行它。

是库解析 URL 以找到主机名,调用者永远不会知道 URL 的哪一部分是主机名,因此调用者无法告诉库在 SNI 请求中发送哪个主机名。如果调用者必须以某种方式找出主机名才能将其告知库,那么这将是一个设计不佳的库。

您可能会更深入地了解软件堆栈,并发现 https 库可能构建在 SSL 库之上。在这种情况下,即使是 https 库也不需要了解 SNI。https 库会简单地告诉 SSL 库,它想要连接到特定的主机名。SSL 库将解析主机名以获取要连接的 IP 地址,SSL 库还将执行 SSL 握手,在此期间客户端可以发送主机名作为 SNI 的一部分,服务器发送主机名作为证书的一部分客户端进行验证。

在连接设置期间,SSL 客户端库需要将主机名用于三种不同的目的。支持为这三个目的使用三个不同的主机名将是微不足道的。https 库已经知道主机名,并且将该主机名传递给 SSL 库三次而不是一次,这不会是任何大量的额外工作。但无论如何,支持这一点几乎没有意义。

事实上,SNI 对 https 库是完全透明的。使用 SNI 支持扩展 SSL 库而不将 API 更改为 https 库是有意义的。几乎没有理由在支持它的客户端中关闭 SNI 支持。因此,默认启用 SNI 是有意义的。

于 2014-06-14T08:41:37.600 回答