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

ced*_*vad 8 tls

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

谢谢你。

Ste*_*ich 10

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

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

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

当然,这让一切都容易受到中间人攻击,因为中间人所要做的就是提供一些不同的证书或让 HTTPS 根本不可用,因为在这种情况下你永远不会尝试将连接升级到 HTTPS。此外,如果中间人这样做,这可以用来使它看起来像客户端支持 SNI。不仅非 SNI 客户端受此影响,而且支持 SNI 的客户端只能被拦截。因此,虽然这在理论上是可能的,但不建议这样做,因为您可以简单地中间人所有内容,从而使使用 HTTPS 的主要观点没有实际意义。