上周启用了 https,昨天偶然使用 IE8 竟然打不开我的网站了,连链接都没有建立,刷新、清缓存、InPrivate 都不行,换 Chrome 也不行,还好 Chrone 有错误提示:
ERR_SSL_VERSION_OR_CIPHER_MISMATCH

唯有我常用的 Firefox 可以正常打开,忘了说,我的操作系统是 Windows XP。

我的主题对 IE 家族做了特殊照顾,向下兼容到 IE6,如果单单是 IE8 以下的浏览器打不开这还能接受,但是 Chrome 也打不开,这就不能接受了。Google 一下ERR_SSL_VERSION_OR_CIPHER_MISMATCH这个错误,在 nginx 网站找到一个答案,说要启用 SNI。然而,这并不是造成以上问题的原因,真正的原因是 cloudflare 的免费CDN 对使用 TLS 协议封装加密的 https 做了限制,要求客户端浏览器必须支持 TLS 的 SNI 扩展,而 XP 系统上 IE、chrome 都不支持 SNI。

SNI 是什么

简单来说 SNI 是 TLS 的一个功能扩展,有了 SNI 就可以在单个 IP 上启用多个 SSL 证书,现实一点说就是可以在只有一个 IP 地址的 VPS 上建立两个或更多的 https 网站了。

关于 SNI 这里有详细介绍:
http://blog.layershift.com/sni-ssl-production-ready

支持 SNI 的浏览器

当今地球上支持 SNI 的主流浏览器如下:

  • Opera 8.0 及更新版本;
  • MSIE 7.0(Windows Vista 或更新版本,XP 下的 MSIE 不支持 SNI);
  • Firefox 2.0 或使用 Mozilla 1.8.1 及更新平台的其它浏览器(的确牛逼);
  • Safari 3.2.1(Windows Vista 或更新版本);
  • Chrome(Windows Vista 或更新版本)。

详情请参见:
http://nginx.org/en/docs/http/configuring_https_servers.html

OpenSSL 对 SNI 的支持

OpenSSL 自 0.9.8f 开始支持 SNI(选配),选配参数--enable-tlsext
OpenSSL 0.9.8j 开始默认启用 SNI。

检测 nginx 是否启用 SNI

nginx -V
出现:
TLS SNI support enabled
即表明 SNI 已启用。

多个SSL证书报错

在有 SNI 之前,以往一个 IP 地址只能存在一个 SSL 证书,否则会提示证书错误。

cloudflare 的免费CDN 只适用于支持 SNI 的浏览器

用了 cloudflare 的免费CDN,速度确实快了很多很多,但是,上面说了 cloudflare 的免费 CDN 限制采用 TLS 封装的 https 只有在支持 SNI 扩展的浏览器才能正常访问。

表现为:

  • IE(6、7、8)无法建立连接。
  • chrome 提示:
    ERR_SSL_VERSION_OR_CIPHER_MISMATCH

本可以不对客户端的浏览器做 SNI 限制,这样做很大一部分原因可能是从成本或产品策略考虑。结合上面说的支持 SNI 扩展的浏览器,也就是说在 Windows XP 下的 IE全线、chrome 浏览器都无法通过 https 方式访问,这恰恰是企业无法忽略的。

这个不该成为问题的问题困扰了我两天时间,一直到当我怀疑这是 cloudflare 免费CDN的限制的时候,停掉 cloudflare 的免费CDN,问题才不解自破。

回头再看,cloudflare 的页面上有这方面限制的明确说明,只能怪自己做事不仔细。

如果同一服务器启用多个 https 网站后无法访问,可能有以下原因:

  1. 服务器只有一个IP地址(有多个IP需做配置);
  2. 服务器没有启用 SNI;
  3. cloudflare 的免费CDN 对使用 TLS 协议加密的 https 做了限制,要求浏览器必须支持 TLS 的 SNI 扩展。

还有多少人使用 Windows XP

有多少人使用 Windows XP 这个问题无从知晓,但Google 统计显示在访问我博客的Windows用户中,Windows XP约占36%,以实际访问量来换算,除了我自己之外,大概很少很少有其他人了,所以,目前不用急着去解决启用 SNI 后 Windows XP 的兼容问题。

via。https://muguayuan.com/2015/2863.html

最后修改:2017 年 08 月 31 日 11 : 02 PM