我需要使用SNI,但不幸的是,最近的Cloudflare博客上只有90%的网络支持它。我如何(例如,使用nginx)检测客户端是否支持SNI并提供/重定向到网站的HTTP版本?这个是可能的吗?否则,我怎么能不失去10%的流量使用SNI?假设在没有有效证书的情况下我无法将HTTPS流量重定向到HTTP,这是否正确,因此这个请求是不可能的?
谢谢。
发布于 2015-03-10 18:25:51
如果您想从一开始就提供HTTPS,您必须从开始就提供客户端接受的证书。否则,客户端将不接受SSL连接,您将无法将客户端重定向到其他站点或仅限HTTP的版本。这意味着你要支持这个案子
如果您不需要从一开始就拥有HTTPS,也就是说,如果客户机通常首先使用普通HTTP连接,那么您可以尝试检测SNI支持,以便以后可以重定向客户机。这可以通过从您的HTTPS站点中包含一个映像、一些JavaScript或类似的内容来实现,如果加载成功,那么您就知道客户机要么支持SNI,要么忽略证书错误。
当然,这使一切都对中间人攻击敞开大门,因为中间人所要做的就是提供不同的证书或使HTTPS完全不可用,因为在这种情况下,您将永远不会尝试升级到HTTPS的连接。此外,这可以被用来使它看起来像是客户支持SNI,如果中间人做它代替。而且不仅非SNI客户端受此影响,而且SNI能力强的客户端只能被拦截。因此,虽然这在理论上是可能的,但不建议这样做,因为您可以简单地在中间进行任何操作,从而使使用HTTPS的要点变得毫无意义。
发布于 2016-09-06 05:31:59
就像我在StackOverflow上发布的,您只能在需要之前测试SNI支持。也就是说,你不能强迫用户使用SNI,如果他们不支持它,就会掉队,因为他们会收到这样的错误( Windows上的Chrome ),没有办法继续下去。

因此(不幸的是)用户必须从不安全的HTTP连接开始,然后只有在支持SNI的情况下才能升级。
您可以通过以下方法检测SNI支持:
<script>,如果脚本加载和运行正确,您知道浏览器支持SNI。https://serverfault.com/questions/674404
复制相似问题