【问题标题】:How do SNI clients send server_name in CLIENT HELLOSNI 客户端如何在 CLIENT HELLO 中发送 server_name
【发布时间】:2014-06-14 08:26:10
【问题描述】:

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

根据https://devcentral.f5.com/articles/ssl-profiles-part-7-server-name-indication#.U5wEnfmSzOz "随着 SNI 的引入,客户端可以在握手过程中指示他尝试连接的服务器的名称,作为 "Client Hello" 消息的一部分"

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

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

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

【问题讨论】:

  • 我担心这是家庭作业,这通常会使它偏离主题。
  • 不是作业,只是想了解 SNI 并向客户解释它,我正在通过 HTTPS(android java.net httpsurlconnection)连接到 SNI 服务器,他说发送服务器名称以及 https 请求,根据我的发现主机名被 SSL 库用作服务器名称,只是想清除它
  • 哦,是的,这是 TLS 协议的一个特性。不过,我不记得具体内容了。从技术上讲,DNS 查找和 TLS SNI 是两个独立的过程,即使任何理智的用户代理都会为两者使用相同的名称(即 TLS 交换不知道任何事情或关心名称解析过程)。

标签: sni


【解决方案1】:

如果您使用的是 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 是有意义的。

【讨论】:

  • 感谢您提供如此详细的答案,正是我需要确认的,SSL 库将发送 SNI 的主机名,除了主机名之外,调用者无法添加单独的(除了主机名)服务器名称什么的……对吧?
  • @baboo 从技术上讲,可以实现一个库,以便您可以将另一个名称传递给该库。我只是不明白 https 库使用任何其他主机名而不是它在 URL 中找到的主机名有什么意义。
  • @baboo 我不知道您使用的特定库。我对协议栈有足够的了解,可以说出什么是有意义的。我对 SNI 的了解来自我需要学习的知识,以便将 SNI 支持添加到 v4-frontend.netiter.com
猜你喜欢
  • 2017-10-14
  • 1970-01-01
  • 2016-05-17
  • 1970-01-01
  • 2013-07-23
  • 2016-10-14
  • 2019-01-02
  • 1970-01-01
  • 2011-02-17
相关资源
最近更新 更多