首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我能否检测SSL客户端是否不支持服务器名称指示,并在这种情况下提供标准HTTP网站?

我能否检测SSL客户端是否不支持服务器名称指示,并在这种情况下提供标准HTTP网站?
EN

Server Fault用户
提问于 2015-03-10 17:29:25
回答 2查看 2.8K关注 0票数 8

我需要使用SNI,但不幸的是,最近的Cloudflare博客上只有90%的网络支持它。我如何(例如,使用nginx)检测客户端是否支持SNI并提供/重定向到网站的HTTP版本?这个是可能的吗?否则,我怎么能不失去10%的流量使用SNI?假设在没有有效证书的情况下我无法将HTTPS流量重定向到HTTP,这是否正确,因此这个请求是不可能的?

谢谢。

EN

回答 2

Server Fault用户

发布于 2015-03-10 18:25:51

如果您想从一开始就提供HTTPS,您必须从开始就提供客户端接受的证书。否则,客户端将不接受SSL连接,您将无法将客户端重定向到其他站点或仅限HTTP的版本。这意味着你要支持这个案子

  • 要么需要一个包含所有域的单一证书,这样就可以为非SNI客户端提供适当的证书。但在这种情况下,你根本不需要SNI。
  • 或者,您必须安装一些与大多数名称不匹配的默认证书。在这种情况下,您只能为客户端提供一个不同的页面,或者在客户端接受这个错误的证书时重定向它。

如果您不需要从一开始就拥有HTTPS,也就是说,如果客户机通常首先使用普通HTTP连接,那么您可以尝试检测SNI支持,以便以后可以重定向客户机。这可以通过从您的HTTPS站点中包含一个映像、一些JavaScript或类似的内容来实现,如果加载成功,那么您就知道客户机要么支持SNI,要么忽略证书错误。

当然,这使一切都对中间人攻击敞开大门,因为中间人所要做的就是提供不同的证书或使HTTPS完全不可用,因为在这种情况下,您将永远不会尝试升级到HTTPS的连接。此外,这可以被用来使它看起来像是客户支持SNI,如果中间人做它代替。而且不仅非SNI客户端受此影响,而且SNI能力强的客户端只能被拦截。因此,虽然这在理论上是可能的,但不建议这样做,因为您可以简单地在中间进行任何操作,从而使使用HTTPS的要点变得毫无意义。

票数 10
EN

Server Fault用户

发布于 2016-09-06 05:31:59

就像我在StackOverflow上发布的,您只能在需要之前测试SNI支持。也就是说,你不能强迫用户使用SNI,如果他们不支持它,就会掉队,因为他们会收到这样的错误( Windows上的Chrome ),没有办法继续下去。

因此(不幸的是)用户必须从不安全的HTTP连接开始,然后只有在支持SNI的情况下才能升级。

您可以通过以下方法检测SNI支持:

  1. 远程脚本从您的普通HTTP页面,从您的目标SNI服务器加载一个<script>,如果脚本加载和运行正确,您知道浏览器支持SNI。
  2. 跨域AJAX ( CORS ) 类似于选项1,您可以尝试从HTTP页面执行跨域AJAX请求到HTTPS,但要注意CORS有只有有限的浏览器支持
  3. 嗅探用户代理 -这可能是最不可靠的方法,您将需要决定是有一个已知的浏览器(和操作系统)黑名单不支持它,或白名单已知的系统。我们知道,所有版本的IE,Chrome和Opera的Windows和以下版本不支持SNI。见支持的浏览器的完整列表的CanIUse.com
票数 0
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/674404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档