cover_image

了解Https SNI 以及 winxp对https支持情况测试

运维军团yw 运维军团 2020年04月20日 04:41

作者:二胖



1 前言

近期接到一例报障,玩家访问https异常,不小心撇见了充值二字,这可得了?

图片

点开证书出现了这样的画面!
图片
证书和域名不匹配,自然是会报警的!
经过排查,最终确认cdn以https SNI方式部署,而该玩家windows XP环境不支持SNI,无法获取到正确的SSL证书导致异常。考虑到业务兼容性,我们做了进一步排查。

2 了解HTTPS与SNI

2.1 什么是HTTPS

HTTPS,是HTTP over SSL/TLS
客户端(一般指浏览器)和服务器(如网页站点)首先进行TLS握手,协商加密参数,最后把HTTP报文加密传输来确保数据安全。

2.2 SSL有哪些版本

SSL是TLS前身,由网景公司开发,有SSL1.0、SSL2.0、SSL3.0版本;自SSL3.1开始由IETF标准化并改名,目前版本有TLS1.0、TLS1.1、TLS1.2、TLS1.3。

web服务器(或CDN节点),普遍支持TLS1.0、TLS1.1、TLS1.2,部分支持较新的TLS1.3
对于SSL1.0、SSL2.0、SSL3.0由于安全原因基本是不支持的。

参考Nginx配置(使用 ssl_protocols来配置)

图片

2.3 什么是SNI

早期SSLv2根据经典的公钥基础设施PKI设计,它默认认为:一台服务器(或者说一个IP)只会提供一个服务,所以在SSL握手时,服务器端可以确信客户端申请的是哪张SSL证书。

但随着apache、nginx等web服务器支持了vhost多虚拟主机模式,一台服务器(IP)可绑定多个不同的站点。假设nginx上配置了多个https站点,有多份SSL证书,使用哪个呢?

根据Host选择?这是不可能的,因为Host是HTTP协议的内容(7层),而SSL证书协商校验在TLS层(4层),此时Host还没发送呢。

古老方案:每个https站点绑定唯一个IP

SNI方案:SNI(Server Name Indication)是TLS协议拓展,在SSLv3/TLSv1中被启用。具体说,客户端在发起TLS握手时把HOST信息带上,Nginx则响应匹配的证书。

图片

因此SNI需要通信双方均支持!

客户端要能在TLS握手时添加该HOST信息。

服务端能够在TLS握手时解码该HOST并返回匹配的证书。

2.4 SNI支持情况

服务端SNI支持情况:

(1) 目前大部分web服务器(apache、nginx等)均已支持

(2) web服务器依赖的OpenSSL库自 0.9.8版本已支持

nginx可使用如下命令检查:

nginx version: openresty/1.13.6.1
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled

也可使用openssl模拟访问

模拟支持SNI方式请求
# openssl s_client -servername www.taobao.com -connect www.taobao.com:443

模拟不支持SNI方式请求
# openssl s_client -connect www.taobao.com:443

客户端支持SNI情况:

主流操作系统和浏览器均支持,个别古老系统如windows XP IE6等除外。


图片

建议参考:
https://caniuse.com/#search=sni
https://www.digicert.com/kb/ssl-support/apache-secure-multiple-sites-sni.htm

开篇报障的玩家恰是windows XP不支持SNI,由于业务原因仍有部分XP用户,考虑到业务的兼容性,需要对winxp不同环境下https支持情况做进一步详细测试,测试如下。

3 WinXP对https支持情况

3.1 XP+IE6 测试

windows在支持期内,会定期发布补丁。一个大的周期间隔,会发一个Service Pack,补丁包合集(便于理解)。windows xp主要有SP2和SP3。
针对winxp、winxp sp2、winxp sp3分别测试对https支持情况,结论如下:
默认浏览器均是IE6,支持SSL2.0 / SSL3.0 / TLS1.0,其中TLS1.0默认不启用;主流的web服务器因安全原因均已不支持SSL2.0/3.0、一般默认支持TLS1.0-1.2(部分支持1.3)
  • xp未启用TLS1.0(即默认情况)

          用IE6基本无法打开https站点(因为TLS1.0未启用)
  • xp启用TLS1.0时情况如下:

    1. winxp 仍无法打开https站点,因为最新的ssl证书均使用sha2算法,sp3以下不支持

    2. winxp sp2 同上
      备注:在特定情况https是可以访问的,如自签sha1或更老算法的ssl证书,但会提示 "证书颁发机构不可验证或过期" 问题

    3. winxp sp3 需要用户点击确定后才可访问,但会提示 "证书颁发机构不可验证或过期" 或 "证书名称和站点不匹配" 

3.2 XP+IE7 测试

升级到IE7,提炼几个重点:

  1. 升级IE7并不会更新系统 信任根证书颁发机构列表;

  2. IE7默认启用SSL2.0/TLS1.0;

  3. winxp pro 和 winxp pro sp2 由于不支持sha256,所以即使更新到IE7、现在网站的SSL证书都不能访问,仍失败;

  4. winxp pro sp3更新到IE7后,对于SNI站点证书会报错(仍不支持SNI),对于部署了多域名证书站点正常。

3.3 问题1:打开TLS1.0

Winxp上IE6默认未启用TLS1.0,始终要引导用户开启 TLS1.0,否则始终存在提示。

工具 — InterNet选项 — 高级 — (安全)使用TLS/1.0  勾选

winxp上第三方浏览器:如360浏览器、qq浏览器、世界之窗等 测试正常,默认支持了TLS1.0。

3.4 问题2:证书颁发机构不可验证

操作系统会内置一份 信任的根证书颁发机构名单,这些机构签发的证书是被直接信任的。

通过开始——运行 certmgr.msc —— 第三方根证书颁发机构,可以找到他们

图片

  • 信任的根证书颁发机构列表如何更新?
    不同wins版本更新机制不一,较新win7及以上,会存在一个服务Cryptographic Services。

    而windows xp需要通过 windows update自动更新工具来实现更新,是以补丁包方式。如KB931125

  • 为什么windows xp会提示 “证书颁发机构不可验证 或过期”?
    是因为windows xp内置列表太老了、而且不全面(当前时间来看)

    因为不全面,没有收录最新的DigiCert CA,所以提示证书颁发机构不可验证


图片

因为太老已过期,虽然曾经信任、奈何已过当年,所以提示证书已到期或还未生效

图片

  • xp如何解决?

    Windows xp上需要手动打开 windows update即更新功能,保持最新。

    也可单独安装 KB931125补丁包(xp最后一次更新的根颁发机构信任列表)

    官网这个补丁包已不存在了,可以参考 https://support.kaspersky.com/13727

    只需下载、解压、安装http://media.kaspersky.com/utilities/CorporateUtilities/rootsupd.zip?_ga=2.115985348.358175183.1586428012-779687598.1585880745


    安装完毕查看新列表

图片

可以看到更新完毕后,补充了很多新的 CA Root,以及我们的证书签发机构DigiCert。


正常情况下,此时 https页面已正常(无任何提示)即可加载了。

3.5 问题3:证书名称和站点不匹配

此处不考虑被劫持等网络异常情况 (如DNS劫持导致该问题)。


最大问题是:客户端不支持SNI,而web服务器部署了多https站点的情况


SNI特性是:客户端在4层TLS协商时,在拓展字段携带上主机HOST,这样web服务器能响应指定证书。这需要客户端和服务端都支持。


而winXP是不支持 SNI的,服务器返回的默认证书无法匹配请求域名,因此报错。


图片

  • xp如何解决?

    在不动客户端的情况下,可以将web服务器的默认ssl证书替换为 多域名证书,比如

图片


3.6  测试小结

综上所述,在xp里面 要想无感(无用户提示)的加载和使用https页面,条件比较苛刻:

  • windows xp SP3系统

  • 要求信任的根证书颁发机构列表已更新 参考补丁KB931125

  • web服务器使用多域名证书部署


公有CDN默认是不支持的,需要联系客服说明情况来针对性部署,会产生一定额外费用。


考虑我们自身业务特殊性和兼容,我们也顺利切换到多域名SSL证书(作为web服务器和cdn节点的默认证书),从而用户访问正常。

4 番外:SSL证书选购

4.1 SSL证书品牌

图片

GeoTrust和Symantec目前都已成为DigiCert公司的子品牌。

高性价比可选GeoTrust,兼顾大品牌效应(和有限期重复签发的特点)可选DigiCert,土豪不差钱的高端必选Symantec。

引用自:https://www.sslzhengshu.com/brand/index.html

4.2 SSL证书产品类型

单域名证书:保护具体单个域名,如果申请证书的域名是www.example.com,默认可以保护不带www的主域名,即example.com。


多域名证书:一张证书中可添加多个域名,甚至来自不同域,一般最大支持150~250个不同域名!通常称之为SAN SSL 或UCC SSL。其实SAN和UCC略有差异,UCC是微软术语,差异参考https://knowledge.digicert.com/solution/SO13974.html。


比如taobao.com的多域名证书


图片


通配符证书:保护一个域名和次级子域名

比如 *.example.com可保护 example.com和random.exmaple.com 但仅支持次级子域名,不能保护 l2.l1.exmaple.com形式!可以单独购买 *.l1.exmaple.com 来实现保护!


多域名通配符证书:即多域名证书里添加有通配域名。 


IP SSL证书:没想到吧!没有域名、针对单IP(或多IP)也能签发证书,满足加密需求。

但使用场景相对局限,仅是为了防域名解析失败、解析劫持而使用IP访问的话,要考虑IP在全网的联通性和延迟。如果是anycast IP + 搭配 IP SSL倒是不错的选择。

比如https://1.1.1.1 和 https://8.8.8.8


图片

4.3 SSL证书验证级别

DV SSL:基础验证,只验证域名管理权,快速签发,浏览器地址栏显示绿色小锁图片


OV SSL:企业验证,证书颁发机构需审查申请单位真实性和域名所有权,签发较慢,浏览器地址栏显示绿色小锁图片
EV SSL:增强验证,证书颁发机构极其严格审查申请单位和域名所有权,最安全级别,浏览器会显示带公司名称的绿色地址栏
图片

4.4 SSL证书的兼容性

不同品牌的证书兼容性相差不大,主流的操作系统、浏览器和客户端等设备均已支持。
具体兼容性列表可参考 证书品牌官网。

4.5 最后

各品牌的SSL产品细节略有不同,熟悉上面几点、捂住口袋,相信选购一张证书应该不是难事!

5 最后

目前主流的操作系统、浏览器和服务器等都基本支持SNI,但仍有部分业务和用户可能异常。如何取舍还是应该要有更的科学依据和数据评估,比如:
  1. 基于访问日志,评估可能异常的用户数据占比

  2. 提供页面引导,异常时提示用户升级浏览器或更新版本

  3. web服务器和CDN部署多域名证书作为默认证书实现更好的兼容性等等


用更稳妥、低成本(采购成本、实现成本、用户接受和改造成本等)的方式来服务于业务,也是我们技术的更高要求呢!







近期文章


  1. 听说你也在找CC防护?

  2. 家庭组网方案大比拼

  3. Docker容器安全性分析

  4. 网络卡顿、虽重不甩

  5. 运维军团开源Scout攻击检测工具

END




全中国只有不到1% 的人关注了运维军团


你是个有眼光的人!


(由于交流群人数已超100人,需要进群的小伙伴可以添加运维小编的微信:)


图片



如果你喜欢我们的文章,请转发到朋友圈

图片 

图片图片
 图片
图片
图片 
公众号
ywjtshare
运维军团
图片 

专注运维技术与传承,分享丰富原创干货
图片图片






微信扫一扫
关注该公众号

继续滑动看下一个
运维军团
向上滑动看下一个