我希望我在正确的地方提出这个问题,关于理解SNI
根据https://devcentral.f5.com/articles/ssl-profiles-part-7-server-name-indication#.U5wEnfmSzOz “随着SNI的引入,客户端可以在握手过程中指示他尝试连接的服务器的名称,作为”客户端Hello“消息的一部分”
我的问题是客户端如何像浏览器或任何HTTP客户端(比如java.net)在CLIENT HELLO中发送此服务器名称?客户端是单独执行还是必须以编程方式将其添加到https请求(例如,如何在JAVA.net中使用HttpsURLConnection)
从http://www.ietf.org/rfc/rfc4366.txt阅读 “目前,唯一支持的服务器名称是DNS主机名” 所以主机名是SNI complient客户端发送的server_name,或者客户端可以发送任何其他名称。
我希望我很清楚,如果不清楚会改进问题/措辞,或者让我知道它是否不清楚 谢谢
答案 0 :(得分:1)
如果您使用的是https库,您可以提供URL,并且库将为您提取该URL的内容,那么添加SNI支持的简洁方法是在库中完全执行它。
这是解析URL以查找主机名的库,调用者永远不会知道URL的哪个部分是主机名,因此调用者无法告诉库在SNI请求中发送哪个主机名。如果调用者必须以某种方式找出主机名以便将其告知库,那么这将是一个设计糟糕的库。
您可能会更深入地了解软件堆栈,并发现https库可能构建在SSL库之上。在这种情况下,甚至https库也不需要知道SNI。 https库只是告诉SSL库它想要连接到特定的主机名。 SSL库将解析主机名以获取要连接的IP地址,SSL库也将执行SSL握手,在此期间客户端可以将主机名作为SNI的一部分发送,并且服务器将主机名作为证书的一部分发送给客户验证。
在连接设置期间,SSL客户端库需要将主机名用于三个不同的目的。支持为这三个目的使用三个不同的主机名是微不足道的。 https库已经知道主机名,并且将该主机名三次传递给SSL库而不是仅仅一个,这将不会产生任何大量的额外工作。但无论如何支持这个都没有意义。
事实上,SNI对https库完全透明。在不将API更改为https库的情况下扩展具有SNI支持的SSL库是有意义的。没有理由在支持它的客户端中关闭SNI支持。因此默认启用SNI是有道理的。