不兼容 SNI 的现象
- 众所周知,伟大的
Windows XP
对 Server 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支持后,重启浏览器。确认安全警告后,能正常打开如下:
- 但拿到的证书都是被第1个加载的证书,欣慰的时访问到的内容(vhost)是正确的:
测试方法
安装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手动信任证书后即可正常浏览:
- 然而,获取到的证书永远是第1个。不过总体讲能打开就是比IE6有进步:
Windows XP + IE8
- IE8 和 IE7 一样,默认即可访问但证书只能获取到第1个:
Windows XP + IE9
- 然而 IE9 并不支持 Windows XP ,需要 Vista 以上系统:
Windows XP + 猎豹浏览器
- 猎豹默认用极速模式(Chrome内核)能正常打开:
- 手动切换到IE兼容模式的情况下,结果和系统所装IE的测试结果相同。比如IE6:
Windows XP + Chrome
- Chrome需要手动确认证书的安全性后,能正常获取到指定域名的https证书。
Windows XP + Firefox
- 手动添加例外后,能正常获取证书和打开网页:
Windows 7 + IE9
- Windows 7 默认是支持SNI的:
- 拿到的证书和内容都是正常的:
Linux + Curl
curl
对sni
也是默认支持的,跳过证书的校验:
Linux + Lynx
- Linux下的文本浏览器
lynx
,和IE6一样拿到的是第1个证书。所以打开第2个网站时会提示证书错误,手动确认后可正常打开:
- 结论就是:至少放弃 IE6 ,换用其它浏览器! 坚持使用系统默认IE的话,请放弃 Windows XP、升级系统。
来源:oschina
链接:https://my.oschina.net/u/1174359/blog/534503