关于 Windows XP 与 HTTPS 兼容的事情

好久不见. 提交于 2019-11-26 11:47:44

不兼容 SNI 的现象

  • 众所周知,伟大的 Windows XPServer Name Indication 的支持不好。表现为打不开某些 https 网页。
  • 为了兼容性,需要关闭SNI以保证IE6能正常访问。这样的代价就是:需要更多的服务器资源(IP不可复用,资源不易复用)。
  • 某些云厂商,开启SNI选项的情况下价格会更优惠、关闭SNI会有额外收费

故障现象

  • Windows XP + IE6 无法打开 https 网页:

无法显示网页

  • 实际上缓解的办法在上图中已显示:

请单击工具菜单,然后单击 Internet 选项。在“高级”选项卡上,滚动到“安全”部分,复选 SSL 2.0、SSL 3.0、TLS 1.0、PCT 1.0 设置。

  • 开启IE6的TLS支持后,重启浏览器。确认安全警告后,能正常打开如下:

开启TLS支持

  • 但拿到的证书都是被第1个加载的证书,欣慰的时访问到的内容(vhost)是正确的:

开启TLS后获取的证书

测试方法

安装Nginx

  • Nginx为例,测试https证书与IE6的兼容性
apt-get -y install nginx # yum -y install nginx

自制证书

  • SNI允许一个IP指向多个证书,那么我们做两个域名使用两个证书。简要如下:
openssl genrsa -des3 -out /etc/nginx/conf.d/s1.key 1024
openssl genrsa -des3 -out /etc/nginx/conf.d/s2.key 1024
openssl req -new -key /etc/nginx/conf.d/s1.key -out /etc/nginx/conf.d/s1.csr
openssl req -new -key /etc/nginx/conf.d/s2.key -out /etc/nginx/conf.d/s2.csr
openssl rsa -in /etc/nginx/conf.d/s1.key -out /etc/nginx/conf.d/s1-nopwd.key
openssl rsa -in /etc/nginx/conf.d/s2.key -out /etc/nginx/conf.d/s2-nopwd.key
openssl x509 -req -days 365 -in /etc/nginx/conf.d/s1.csr -signkey /etc/nginx/conf.d/s1-nopwd.key -out /etc/nginx/conf.d/s1.crt
openssl x509 -req -days 365 -in /etc/nginx/conf.d/s2.csr -signkey /etc/nginx/conf.d/s2-nopwd.key -out /etc/nginx/conf.d/s2.crt

Nginx.conf 片段

  • 对应https的关键配置段:
server {
    listen       443 ssl;
    server_name  s1.higkoo.com;
    ssl_certificate conf.d/s1.crt;
    ssl_certificate_key conf.d/s1-nopwd.key;
    charset utf-8;
    location / {
        add_header id 's1';
        stub_status on;
        access_log off;
    }
}
server {
    listen       443 ssl;
    server_name  s2.higkoo.com;
    ssl_certificate conf.d/s2.crt;
    ssl_certificate_key conf.d/s2-nopwd.key;
    ssl_session_timeout 30m;
    ssl_protocols TLSv1.2 TLSv1.1 TLSv1 SSLv3; # protocols、ciphers 参考 google、baidu,兼顾 安全和兼容性。
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA:RSA+AES:TLS_RSA_WITH_3DES_EDE_CBC_SHA:TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA:RC4-SHA:ECDHE-RSA-RC4-SHA;
    ssl_session_cache shared:SSL:50m;
    ssl_prefer_server_ciphers off;
    charset utf-8;
    location / {
        add_header id 's2';
        stub_status on;
        access_log off;
    }
}

兼容性测试

  • 那么 Windows XP 下其它浏览器是否能正确处理呢?

Windows XP + IE7

  • 不需要任何特殊设置(重置默认配置),IE7手动信任证书后即可正常浏览:

IE7可以正常浏览

  • 然而,获取到的证书永远是第1个。不过总体讲能打开就是比IE6有进步:

证书永远是第1个

Windows XP + IE8

  • IE8 和 IE7 一样,默认即可访问但证书只能获取到第1个:

证书永远是第1个

Windows XP + IE9

XP装不上IE9

Windows XP + 猎豹浏览器

  • 猎豹默认用极速模式(Chrome内核)能正常打开:

正常访问

  • 手动切换到IE兼容模式的情况下,结果和系统所装IE的测试结果相同。比如IE6:

极速模式

Windows XP + Chrome

  • Chrome需要手动确认证书的安全性后,能正常获取到指定域名的https证书。

Chrome正常

Windows XP + Firefox

  • 手动添加例外后,能正常获取证书和打开网页:

正常打开

Windows 7 + IE9

  • Windows 7 默认是支持SNI的:

在Win7下则正常

  • 拿到的证书和内容都是正常的:

Win7和IE9表现良好

Linux + Curl

  • curlsni也是默认支持的,跳过证书的校验:

以curl示例

Linux + Lynx

  • Linux下的文本浏览器lynx,和IE6一样拿到的是第1个证书。所以打开第2个网站时会提示证书错误,手动确认后可正常打开:

证书错误

  • 结论就是:至少放弃 IE6 ,换用其它浏览器! 坚持使用系统默认IE的话,请放弃 Windows XP、升级系统。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!