作为古董级的系统,XP 确实有很多兼容问题。例如很多 HTTPS 页面报错:无法显示该页面。这都还不是能显示但有问题,是直接无法显示。追查了很多资料,最终确认了原因:SNI。
什么是 SNI
随着 IPv4 地址的短缺,为了让多个域名复用一个 IP,在 HTTP 服务器上引入了虚拟主机的概念。服务器可以根据客户端请求中不同的 host,将请求分发给不同的域名(虚拟主机)来处理。
但是,在一个被多个域名(虚拟主机)共享 IP 的 HTTPS 服务器中,由于在握手建立之前服务器无法知道客户端请求的是哪个 host,所以无法将请求交给特定的虚拟主机。然而,要完成握手,又必须读取虚拟主机中配置的证书信息。
Server name indication(简称 SNI)就是用来解决这个矛盾问题的。SNI 要求客户端在与服务器握手时就携带需要访问的域名的 host 信息。这样,服务器就知道需要用哪个虚拟主机的证书与客户端握手并建立 TSL 连接。
SNI 最早在 2004 年被提出,目前主流的浏览器、服务器和测试工具都已支持 SNI。
SNI 客户端兼容性
- Chrome 5 及以上版本
- Chrome 6 及以上版本
- Firefox 2 及以上版本
- Internet Explorer 7 及以上版本(仅支持 Windows Vista、Windows Server 2008 及以上版本操作系统。在 Windows XP 系统中,任何版本的 IE 浏览器都不支持 SNI。)
- Konqueror 4.7 及以上版本
- Opera 8 及以上版本
- Safari 3.0 及以上版本(仅支持 Windows Vista、Windows Server 2008 及以上版本操作系统,或 Mac OS X 10.5.6 及以上版本操作系统。)
- Android 3.0 Honeycomb 及以上版本
- iOS 4 及以上版本
- Windows Phone 7 及以上版本
SNI 服务器兼容性
- Apache 2.2.12 及以上版本
- Apache Traffic Server 3.2.0 及以上版本
- Cherokee
- HAProxy 1.5 及以上版本
- IIS 8.0 及以上版本
- Lighttpd 1.4.24 及以上版本
- LiteSpeed 4.1 及以上版本
- Nginx 0.5.32 及以上版本
XP 解决办法
整站的域名使用了一个证书,配置使用了更低级别的协议。
SSLProtocol all -SSLv3 SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA