几天前,一位朋友问我:都说推荐用 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 可以通过以下命令查看:

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

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 来验证。以下是我的验证结果:

BASH./nginx -V
nginx version: nginx/1.9.9
built by gcc 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04) built with OpenSSL 1.0.2e-dev xx ‍ xxxx TLS SNI support enabled 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 上,最简单的做法是分开部署到不同机器上。

另外,包含 SAN(Subject Alternative Name)的证书能同时支持多个域名,也可以用于解决这个问题。

证书选择

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 的特征来分配不同证书。现在有一些网站利用 IE on Windows XP 不支持 SNI 这个特性,配置使用 SHA-1 证书的 Default Server 给它们用。

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

本文链接:https://imququ.com/post/sth-about-switch-to-https-2.html,参与评论。

转载于:https://www.cnblogs.com/dasn/articles/5332976.html

转:关于启用 HTTPS 的一些经验分享(二)相关推荐

  1. [软考]系统架构设计师 备考经验分享(二) - 知识点学习+综合知识篇

    2021.12.20 更新下成绩 49,53,55 原文: 本篇对应备考计划中的1.2阶段: 相关分享: 备考计划篇:[软考]系统架构设计师 备考经验分享(一) - 备考计划篇 知识点学习+综合知识篇 ...

  2. 苹果AppStore应用商店生存之道:国内iOS开发者创业经验分享(二)

    4. 中国市场攻略:正篇 对于中国市场,我会写两篇.第一篇为正篇,是指传统的,卖App应用或游戏的商业模式.第二篇为奇篇,会讲一些其它的商业模式.现在的中国市场,几个字,"不成熟" ...

  3. 经验分享 | 二本直博浙大?我只是写了篇论文而已

     基本情况  院校背景:国内某双非二本院校 GPA:3.7/4 获得offer:浙江大学的直博资格 我是小南,很多人问我从二本院校成功跨越到国内知名高校的秘诀是什么,我个人觉得,除开运气,最大的&qu ...

  4. 华夏银行笔试c语言,华夏银行笔试经验分享

    华夏银行笔试经验分享(一) 说下能力测试 前5题是数列求规律,感觉好累,我是学数学的,这5倒小题每的 个1分钟差不多,太费时间了. 5-10 是应用题,感觉好累,太费时间了,后面两个就不算了,以因为牵 ...

  5. 中国人民大学计算机专硕好考吗,干货:中国人民大学考研复试成功经验分享,值得收藏!...

    考研之路或许不会一帆风顺,回望过去,有备考途中的失意,有初试通过的欣喜,有家人朋友的陪伴--不到最后时刻,永远不轻言放弃,不到最后胜利,永远不掉以轻心. 今天,小编为你们准备了干货满满的考研复试经验, ...

  6. [软考]系统架构设计师 备考经验分享(一) - 备考计划篇

    2021.12.20 更新下成绩 49,53,55 原文: 相关分享: 备考计划篇:[软考]系统架构设计师 备考经验分享(一) - 备考计划篇 知识点学习+综合知识篇:[软考]系统架构设计师 备考经验 ...

  7. 建设银行计算机岗位面试经验,建设银行校园招聘各岗位往年考生面试经验分享...

    [导语]2018年建设银行面试马上既要开始了,银行面试是银行校园招聘的最后一关,且至关重要,掌握银行面试具体内容能帮你顺利!无忧考网为大家整理了建设银行校园招聘各岗位往年考生面试经验分享,帮助考生备考 ...

  8. 前端不哭!最新优化性能经验分享来啦 | 技术头条

    作者 | Dimitris Kiriakakis 译者 | 风车云马 编辑 | Jane 出品 | Python大本营(id:pythonnews) [导语]Angular.React.VueJS 是 ...

  9. 【微学堂】线上Linux服务器运维安全策略经验分享

    技术转载:https://mp.weixin.qq.com/s?__biz=MjM5NTU2MTQwNA==&mid=402022683&idx=1&sn=6d403ab447 ...

  10. 云计算架构师分享:容器云在金融企业的落地方案 | 周末送资料(原题:某保险公司容器云PaaS平台建设实践经验分享)

    [摘要]随着技术和社区的成熟,容器.Kubernetes.微服务等新事物不再只是概念,已在很多企业落地并发挥了生产力,对容器和PaaS的需求也从试探性转向规模化推广和纵深探索,建设企业级容器PaaS平 ...

最新文章

  1. Error: Module build failed: TypeError: this.getResolve is not a function at Object.loader
  2. Android美工坊:Selector选择器的使用
  3. 链表问题5——反转部分单向链表
  4. centos7部署DM8
  5. SQL server 2016 安装步骤
  6. Redis的缓存穿透问题和雪崩问题?
  7. final/override控制
  8. 协同过滤进化版本NeuralCF及tensorflow2实现
  9. php文件上传详解,PHP文件上传实例详解!!!
  10. LG-Transformer:全局和局部建模Transformer结构新作
  11. 第四季-专题9-Linux驱动开发前奏
  12. 哈佛医学院研究员解读DeepMind大突破AlphaFold:有进步,但未解决根本问题
  13. Go语言学习笔记(8)——包和结构体
  14. java jax ws_Java 7是否包含JAX-WS实现或API?
  15. macbook设置充电上限
  16. iphone计算机同样答案,学会这4招,iPhone搭配Windows电脑一样好用
  17. 微型计算机是第四代计算机的产物,计算机的发展已经过了4代,其中()是第四代计算机 - 问答库...
  18. Collections中Counter函数,namedtuple函数,defaultdict函数的使用
  19. 程序实现金融租赁融资试算器 Financial Calculator
  20. 中学计算机教师招聘面试题,中学教师招聘面试题目-20210528215022.docx-原创力文档...

热门文章

  1. openflow通信流程总结
  2. [收藏] Flash闪存颗粒和工艺知识深度解析
  3. 代码题(23)— 数组中的最长山脉
  4. 局域网内时间同步配置
  5. Topic 7. 临床预测模型--Cox回归
  6. 成考专科计算机专业,我是计算机专科生,成考想换个专业,请问学什 – 手机爱问...
  7. 金融壹账通拟7月4日香港上市:2年亏近30亿 市值蒸发超90%
  8. esxi 创建虚拟交换机_对vSphere虚拟交换机的理解
  9. 苹果手机白屏_苹果手机白屏怎么处理啊
  10. 汽车厂自制的流水线边 物料亮灯防错系统