在前面的文章中(http://www.zzygx.cc/?p=727),我们曾说过用了cloudflare的SSL证书加密了CDN的网站在XP系统中无法打开,会因为握手失败而无法访问,在谷歌浏览器中会出现ERR_SSL_VERSION_OR_CIPHER_MISMATCH的错误代码。当时我们曾说可能是因为XP不支持TLS 1.3所致,这是因为TLS 1.3是最近刚刚推出的协议,古老的XP当然不会兼容了。其实并不仅仅是TLS版本低这么简单,真正无法打开是因为这个原因,那就是XP系统不支持SNI。

 

什么是SNI,SNI是英文Server Name Indication的缩写,中文叫做服务器名称指示。详细了解请看维基(需爬梯)。关于详细的原理我不再多废话了,了解更多内容可以查看本文最后的参考资料。我只简单说一下SNI究竟在HTTPS的CDN中扮演什么角色吧,SNI在HTTPS中扮演的是只用一个公网IP就可以给多个不同的域名使用SSL证书的角色。现在IPV4地址资源非常紧张,以往的SSL证书只能是一个域名跟一个IP地址绑定,在IPV4环境下资源浪费严重。SNI就是很多个域名共享一个IP地址的服务,比如HTTPS的加密CDN和web应用防火墙这类需要提供HTTPS并且使用共享IP地址的服务就得用到它。

 

要说SNI的出现这是好事,既可以使用HTTPS又能节约IP资源一举两得。但需要各位注意的是,SNI是2004年才推出的,在这之后的操作系统(vista之后的)和浏览器肯定都支持,但是在2001年推出的XP恰恰就不支持SNI。

 

XP SP3半支持SNI,主流浏览器全都支持,真正的问题出在IE浏览器身上

 

XP系统如果使用的是IE6需要将Internet选项中高级里面的SSL 2.0/SSL 3.0/TLS 1.0/PCT1.0全部打钩才能部分兼容,IE7/8可以点信任证书就能访问,但会出现红色的证书错误。现代浏览器比如谷歌系的可以打开网页但也是红色错误,火狐暂无此情况。有人说其实现在这些主流的浏览器都是支持SNI的,XP SP3系统(2008年发布)半支持SNI也没啥问题,为什么还会出现无法访问呢?

 

答案在CF身上

 

还记得上文中我们所讲到的那个证书吗,那就是使用了SNI的证书。域名是 sni.cloudflaressl.com 的那个证书,作为加密CDN,毫无疑问他们的https证书只能加密给自己的一个主域名但是这个域名下面可以通过SNI给无限的域名提供HTTPS+CDN服务,也就是共享证书加密CDN服务。所有的CDN用户用的都是他们自己CDN的那些IP地址,那么一个IP地址上面肯定是要给很多域名的网站提供服务,那么CF的用户都用大量的域名去使用同一个IP去使用HTTPS+CDN服务,必然要用到SNI服务提供共享SSL资源。这就相当于一个服务器里分出多个虚拟主机一样,节省了IP的资源又能给很多用户提供加密CDN服务,这就是SNI。所以CF的HTTPS(SSL)+CDN服务本质上就是一个SNI服务。

 

现在既然已经知道这是SNI服务了,那么为什么还会出现用了他们家加密CDN的网站XP不能访问呢?CF的SNI其实就是共享证书的CDN。这里要说一下,准确的说是用了免费套餐的网站XP无法访问,那些付了费一个月20刀200刀的网站XP还是可以访问的。比如hosteons、ramnode、搬瓦工这类VPS服务商基本都在用他们家的防CC攻击的五秒盾,五秒盾是付费用户才能用的,所以他们就是CF的付费用户这样XP完全是可以访问他们的(XP是可以访问这些网站的,即便他们也是CF的HTTPS+CDN的网站)。因为付费用户他们可以使用自己的CA证书(一般是SSL选项里的最后一个)再套上CF的CDN基本上一个域名配一个证书再套上CDN,这就成了独享证书的CDN。独享证书CDN那不叫SNI,而我们这些免费用户用的共享证书CDN就是XP所不能打开网站的SNI,这也是为什么这种情况多发生在使用国外VPS套了CF的加密CDN的个人博客站点的原因。

 

XP为什么会打不开这种网站还有一个重要的因素就是CF给客户端的是ECDSA证书所致,ECDSA证书是新证书在win7以上系统就能解密,而XP系统因无法解密这一证书,最终导致无法打开网站。XP的所有IE浏览器版本(6/7/8)全部无法打开,XP用户在使用谷歌系浏览器发送请求的时候,CF会认为这是个现代浏览器会发ECDSA证书,谷歌也不会自行解密证书,只能调用IE浏览器解密,而前面说了XP下的IE浏览器解密SNI根本解不了,这个ECDSA证书恰恰就是XP所解不开的,那么自然结果就是无法访问。而如果发的是老的RSA证书,这别说是XP就是95、98、2000都能打开。所以除了SNI不兼容之外分发下来的ECDSA证书也是导致XP无法访问套CF加密CDN的网站的重要原因。

 

最终原因查明,一个原因是XP下的IE底层无法使用和解密SNI。另一个是XP上的谷歌系浏览器无法解密ECDSA证书,需要IE底层解密,但是IE的SNI又不可用,最后无法解密而不能访问,最终成为一个死循环。

 

怎么办?用火狐等其他浏览器,他们不调用IE浏览器解密,而是自行解密。如果实在还是不行那就只能换掉XP系统吧,这是系统缺陷无解。生的太早了XP出生的那个时候还没有SNI,毕竟有XP的时候https网站还很少。

 

 

参考资料:

 

中国72%的个人电脑仍然使用Windows XP- SSL/SNI

 

另一个问题是,XP缺少SNI支持,SNI可以使得SSL站点在同一个IP地址或认证上,使用多个名称或域名。尽管SNI在国外越来越流行,但是在国内却毫无用武之地,因为72%的中国用户无法使用它。这迫使站点使用另一个主体名称或通配符认证,而这两个东西都是很昂贵而且有各自缺点的。

 

为了SNI,请淘汰你的Windows XP

 

为了SNI,请淘汰你的Windows XP

 

各操作系统与浏览器下的SNI访问情况测试

 

关于 Windows XP 与 HTTPS 兼容的事情

 

关于 Windows XP 与 HTTPS 兼容的事情 

 

原理分析

 

SSL握手中win xp和SNI的那点事

 

阿里云帮助文档关于SNI的有关介绍

 

SNI可能引发的HTTPS访问异常_常见问题_DDoS高防(旧版)_DDoS防护-阿里云

 

SNI兼容性导致HTTPS访问异常(服务器证书不可信)_常见问题_Web 应用防火墙-阿里云

 

MJJ大神的解答

 

cloudflare家的免费ssl为什么xp+ie\chrome不能访问-美国VPS综合讨论-全球主机交流论坛

 

解决方案

 

nginx 里如何配置,使 xp 系统的用户访问 http,win7 以上用户访问 https – V2EX

 

[Nginx] 搜索引擎不支持收录 https 网页以及 XP 系统不支持 SNI 的解决办法

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注