如何针对老旧浏览器设置 HTTPS 策略

如何针对老旧浏览器设置 HTTPS 策略

几天前,一位朋友问我:都说推荐用 Qualys SSL Labs 这个工具测试 SSL 安全性,为什么有些安全实力很强的大厂家评分也很低?我认为这个问题应该从两方面来看:

  1. 国内用户终端情况复杂,很多时候降低 SSL 安全配置是为了兼容更多用户;
  2. 确实有一些大厂家的 SSL 配置很不专业,尤其是配置了一些明显不该使用的 CipherSuite。

我之前写的《关于启用 HTTPS 的一些经验分享(一)》,主要介绍 HTTPS 如何与一些新出的安全规范配合使用,面向的是现代浏览器。而今天这篇文章,更多的是介绍启用 HTTPS 过程中在老旧浏览器下可能遇到的问题,以及如何取舍。

SSL 版本选择

TLS(传输层安全Transport Layer Security)的前身是 SSL(安全套接字层Secure Sockets Layer),它最初的几个版本(SSL 1.0、SSL 2.0、SSL 3.0)由网景公司开发,从 3.1 开始被 IETF 标准化并改名,发展至今已经有 TLS 1.0、TLS 1.1、TLS 1.2 三个版本。TLS 1.3 改动会比较大,目前还在草案阶段。

SSL 1.0 从未公开过,而 SSL 2.0 和 SSL 3.0 都存在安全问题,不推荐使用。Nginx 从 1.9.1 开始默认只支持 TLS 的三个版本,以下是 Nginx 官方文档中对 ssl_protocols 配置的说明:

Syntax: ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
Default: ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
Context: http, server
Enables the specified protocols. The TLSv1.1 and TLSv1.2 parameters work only when the OpenSSL library of version 1.0.1 or higher is used.

但不幸的是,IE 6 只支持 SSLv2 和 SSLv3(来源),也就是说 HTTPS 网站要支持 IE 6,就必须启用 SSLv3。仅这一项就会导致 SSL Labs 给出的评分降为 C。

加密套件选择

加密套件CipherSuite,是在 SSL 握手中需要协商的很重要的一个参数。客户端会在 Client Hello 中带上它所支持的 CipherSuite 列表,服务端会从中选定一个并通过 Server Hello 返回。如果客户端支持的 CipherSuite 列表与服务端配置的 CipherSuite 列表没有交集,会导致无法完成协商,握手失败。

CipherSuite 包含多种技术,例如认证算法Authentication、加密算法Encryption、消息认证码算法Message Authentication Code(MAC)、密钥交换算法Key Exchange和密钥衍生算法Key Derivation Function。

SSL 的 CipherSuite 协商机制具有良好的扩展性,每个 CipherSuite 都需要在 IANA 注册,并被分配两个字节的标志。全部 CipherSuite 可以在 IANA 的 TLS Cipher Suite Registry 页面查看。

OpenSSL 库支持的全部 CipherSuite 可以通过以下命令查看:


  1. openssl ciphers -V | column -t
  2. 0xCC,0x14 - ECDHE-ECDSA-CHACHA20-POLY1305 TLSv1.2 Kx=ECDH Au=ECDSA Enc=ChaCha20-Poly1305 Mac=AEAD
  3. ... ...

0xCC,0x14 是 CipherSuite 的编号,在 SSL 握手中会用到。ECDHE-ECDSA-CHACHA20-POLY1305 是它的名称,之后几部分分别表示:用于 TLSv1.2,使用 ECDH 做密钥交换,使用 ECDSA 做认证,使用 ChaCha20-Poly1305 做对称加密,由于 ChaCha20-Poly1305 是一种 AEAD 模式,不需要 MAC 算法,所以 MAC 列显示为 AEAD。

要了解 CipherSuite 的更多内容,可以阅读这篇长文《TLS 协议分析 与 现代加密通信协议设计》。总之,在配置 CipherSuite 时,请务必参考权威文档,如:Mozilla 的推荐配置CloudFlare 使用的配置

以上 Mozilla 文档中的「Old backward compatibility」配置,以及 CloudFlare 的配置,都可以很好的兼容老旧浏览器,包括 Windows XP / IE6。

之前见到某个大厂家居然支持包含 EXPORT 的 CipherSuite,这些套件在上世纪由于美国出口限制而被弱化过,已被攻破,实在没有理由再使用。

SNI 扩展

我们知道,在 Nginx 中可以通过指定不同的 server_name 来配置多个站点。HTTP/1.1 协议请求头中的 Host 字段可以标识出当前请求属于哪个站点。但是对于 HTTPS 网站来说,要想发送 HTTP 数据,必须等待 SSL 握手完成,而在握手阶段服务端就必须提供网站证书。对于在同一个 IP 部署不同 HTTPS 站点,并且还使用了不同证书的情况下,服务端怎么知道该发送哪个证书?

Server Name Indication,简称为 SNI,是 TLS 的一个扩展,为解决这个问题应运而生。有了 SNI,服务端可以通过 Client Hello 中的 SNI 扩展拿到用户要访问网站的 Server Name,进而发送与之匹配的证书,顺利完成 SSL 握手。

Nginx 在很早之前就支持了 SNI,可以通过 nginx -V 来验证。以下是我的验证结果:


  1. ./nginx -V
  2. nginx version: nginx/1.9.9
  3. built by gcc 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04)
  4. built with OpenSSL 1.0.2e-dev xx XXX xxxx
  5. TLS SNI support enabled
  6. configure arguments: --with-openssl=../openssl --with-http_ssl_module --with-http_v2_module

然而,并不是所有浏览器都支持 SNI,以下是常见浏览器支持 SNI 的最低版本:

浏览器 最低版本
Chrome Vista+ 全支持;XP 需要 Chrome 6+;OSX 10.5.7+ 且 Chrome 5+
Firefox 2.0+
Internet Explorer 7+ (需要 Vista+)
Safari 3+ (需要 OS X 10.5.6+)
Mobile Safari iOS 4.0+
Android Webview 3.0+

可以看到,现在还有一定用户量的 Windows XP IE6~8、Android 2.x Webview 都不支持 SNI。如果要避免在这些浏览器中出现证书错误,只能将使用不同证书的 HTTPS 站点部署在不同 IP 上,最简单的做法是分开部署到不同机器上。

证书选择

HTTPS 网站需要通过 CA 取得合法证书,证书通过数字签名技术确保第三方无法伪造。证书的简单原理如下:

  • 根据版本号、序列号、签名算法标识、发行者名称、有效期、证书主体名、证书主体公钥信息、发行商唯一标识、主体唯一标识、扩展生成 TBSCertificate(待签名证书To Be Signed Certificate)信息;
  • 签发数字签名:使用 HASH 函数对 TBSCertificate 计算得到消息摘要,用 CA 的私钥对消息摘要进行加密,得到签名;
  • 校验数字签名:使用相同的 HASH 函数对 TBSCertificate 计算得到消息摘要,与使用 CA 公钥解密签名得到内容相比较;

使用 SHA-1 做为 HASH 函数的证书被称之为 SHA-1 证书,由于目前已经找到 SHA-1 的碰撞条件,将证书换成使用更安全的 SHA-2 做为 HASH 函数的 SHA-2 证书被提上日程。

实际上,微软已经宣称自 2017 年 1 月 1 日起,将全面停止对 SHA-1 证书的支持。届时在最新版本的 Windows 系统中,SHA-1 证书将不被信任。

而根据 Chrome 官方博客的文章,使用 SHA-1 证书且证书有效期在 2016 年 1 月 1 号至 2016 年 12 月 31 号之间的站点会被给予「安全的,但存在漏洞」的提示,也就是地址栏的小锁不再是绿色的,并且会有一个黄色小三角。而使用 SHA-1 证书且证书有效期超过 2017 年 1 月 1 号的站点会被给予「不安全」的红色警告,小锁上直接显示一个红色的叉。

然而,并不是所有的终端都支持 SHA-2 证书,服务

端不支持还好办,浏览器只能依赖于用户升级了。下面是常见浏览器支持 SHA-2 证书的最低版本:

浏览器 支持 SHA-2 证书的最低版本
Chrome 26+
Firefox 1.5+
Internet Explorer 6+ (需要 XP SP3+)
Safari 3+ (需要 OS X 10.5+)
Android Webview 2.3+

可以看到,如果要照顾没有打 XP SP3 补丁的 IE6 用户,只能继续使用 SHA-1 证书。

在我之前的文章中,还提到过 ECC 证书,这种新型的证书支持度更差,这里略过不提,有兴趣的同学可以点这里查看。

是否可以针对不同浏览器启用不同证书呢?理论上服务端可以根据客户端 Client Hello 中的 Cipher Suites 特征以及是否支持 SNI 的特征来分配不同证书,不过我没有实际验证过。

本文先写这么多,很多策略都需要根据自己网站的用户来决定,例如我的博客基本没有 IE8- 用户,理所当然可以禁用 SSLv3。如果你的产品还有很多使用老旧浏览器的用户,那就必须为这些用户做兼容方案了。一种方案是:只把主域安全级别配低,将 XP 上 IE 用户的 HTTPS 请求直接重定向到 HTTP 版本,这样其它域名可以使用高安全级别的配置,运维起来比较方便。

本文来自合作伙伴“Linux中国”

原文发布时间为:2013-04-02.

时间: 2024-08-03 02:09:17

如何针对老旧浏览器设置 HTTPS 策略的相关文章

老旧小区安防升级改造有机遇也有难度

老旧小区的安防升级改造迫在眉睫 中国城市小区建设已经有几十年的历史了.不少小区因规划建设年代早,建设标准相对较低,不同程度地存在着管线老化.设备年久失修.安防和治安管理落后.道路破损等诸多问题.社区老龄化给城市管理和居民生活带来了各种难题. 在这些问题中,安防和和治安管理落后的问题也比较严重.当我们走进一些老小区经常会看到这样的场景:小区没有固定停车场,车辆停得横七竖八:楼道大门常年洞开,有的门禁系统形同虚设:推销的各色人等走进走出,无人问津:小区缺少监控摄像头,存在非常多的监控死角,有些小区即

老旧小区安防难题成遗留“沉疴” 如何破解?

中国城市小区建设已经有几十年的历史了.不少小区因规划建设年代早,建设标准相对较低,不同程度地存在着管线老化.设备年久失修.安防和治安管理落后.道路破损等诸多问题.社区老龄化给城市管理和居民生活带来了各种难题. 老旧小区安防难题成遗留"沉疴" 如何破解? 老旧小区弊病诸多 治安落后 一般来看,小区要解决内部安防问题并不是什么难事,无非就是这样两点:加强人防和技防,即花钱雇保安,花钱购置安防设备.不过,对于一个有着十几年甚至几十年"区龄"的老旧小区来说,事情远没有这么简

老旧小区供热管网昨起“体检”

本报讯(记者文静)昨天起,全市供热管网进入二次"体检",专门针对老旧小区管网,解决跑冒滴漏.局部不热.冷热不均等问题.此外,第一批5万吨应急储煤已经准备到位,随时应对极端天气下出现的能源紧张. 昨天,记者从市供热办获悉,从昨天开始,全市启动供热管网第二次调试,主要针对老旧小区管网."第一次调试已经完成,大的供热管网已经热起来.现在开始解决老旧小区等边角问题." 供热办相关618.html">负责人表示,预计供热管网的二次调试将持续3天至4天,全面解决

针对不同的浏览器写不同的CSS code

首先建站学带你了解下什么是CSS hack: CSS hack由于不同的浏览器,比如Internet Explorer 6,Internet Explorer 7,Mozilla Firefox等,对CSS的解析认识不一样,因此会导致生成的页面效果不一样,得不到我们所需要的页面效果. 这个时候我们就需要针对不同的浏览器去写不同的CSS,让它能够同时兼容不同的浏览器,能在不同的浏览器中也能得到我们想要的页面效果.这个针对不同的浏览器写不同的CSS code的过程,就叫CSS hack! 我们先看下

用滤镜制作褶皱老旧照片效果

  本褶皱实例教程中我们介绍如何用Photoshop的滤镜来快速打造褶皱老旧照片特效,将一张图画变成揉皱的效果.先看原图和效果图:     一.打开一个新建立文件,黑白前背景色.滤镜--渲染--分层云彩.CTAL+F多进行几次以增加它的层次感.   二.滤镜--风格化--浮雕效果.参数看情况,我 的参数如图,这样已经形成我们所需要的皱纹效果了.   三.滤镜--模糊--高撕模糊,另存文件.这个文件是要用来给目标文件置换的,为什么要模糊呢?先卖个关,看下一步就知道了.   四.CTRL+Z,返回模

Fireworks绘制红色老旧砖墙特效

绘制红色老旧砖墙的实例. 1.在Fireworks中建立一个新文件,宽800像素高310像素.当然也可以自己定义图像大小. 画一个同文件大小的矩形.属性为:充填(灰色)充填类别:(线性渐变).在点效果→杂点→新增杂点.属性为(数量15)得到效果如下图: 2.复制(CTRL+C)粘贴(CTRL+V)刚才的矩形选效果→Eye candy 4000滤镜→摇动效果.属性为(移动类型:Browniar动作,泡沫尺寸:307.69,弯曲数量:334.32,扭曲:49.) 设置完后继续点效果→斜角和浮雕→内斜

Windows、macOS和Linux平台设置HTTPS以及自签名证书详细指南

本文讲的是Windows.macOS和Linux平台设置HTTPS以及自签名证书详细指南, 在本文中,我会向大家介绍如何在Windows.macOS和Ubuntu Linux上设置使用HTTPS与ASP.NET Core的本地开发环境,另外,我还将介绍如何创建自签名证书并将其添加到受信任的根证书存储区,以消除烦人的浏览器提示消息.最后,我将介绍如何设置用于ASP.NET Core的内置Web服务器的Kestrel来使用HTTPS. 创建自签名证书,设置信任项,就可以避免烦人的浏览器提示,记录了自

打补丁总是拖延症,雅虎被发现存在Struts2“老旧”高危漏洞

本文讲的是打补丁总是拖延症,雅虎被发现存在Struts2"老旧"高危漏洞,我一直都认为分享精神是可贵的,我过去从很多安全领域大牛的漏洞报告中学到了很多知识,所以我决定将我找到的漏洞经历进行分享,希望能够帮助到一些刚刚开始挖洞的白帽子们. 就像之前爆出来的Struts2高危漏洞(CVE-2017–5638),由于攻击条件比较简单,导致了众多Web应用程序沦陷. 在该漏洞的exp爆出来三周之后,我在渗透过程中发现了这个链接: https://svdevems01.direct.gq1.ya

如何把老旧笔记本变成一部 Chromebook

如果你对于谷歌的Chrome OS十分好奇,但暂时还不想花钱购买一部Chromebook,那你可能会对CloudReady这款软件感兴趣.有了它,你就可以在一部普通的笔记本上面体验谷歌这款轻量级的操作系统.如果你手头恰好有一部闲置不用的笔记本,本文的指南可以让你把它变成一部Chromebook. 准备工作 CloudReady是一款完整的操作系统,它在安装时会擦除计算机原本存储的所有内容.如果你不打算将其安装在U盘,那最好还是使用一部闲置不用的计算机.CloudReady目前并不支持双系统启动.