4、TLS版本演进:SSLv3到TLS 1.3的变更
聊到TLS版本,我见过不少团队还在用老掉牙的TLS 1.0,甚至有人问我能不能开SSLv3。每次我都反问一句:你确定要开一个2003年就封堵不住的漏洞?
说白了,TLS版本的演进史,就是一部加密算法与攻击者的攻防史。今天我把从SSLv3到TLS 1.3的关键变更给你拆开讲。
4.1 从SSL到TLS:一个名字的变迁
先纠正一个常见误区:SSL和TLS是什么关系?
其实是改名了。Netscape在1995年推出SSL 2.0,后来1996年出了SSL 3.0。1999年IETF接手,觉得不能再用商业公司的名字,就改叫TLS。所以TLS 1.0 ≈ SSL 3.1。
我在项目中遇到过客户发来的配置文件要求启用SSLv3,直接被我劝退了——这玩意儿已经16年没更新patch了。
| 协议版本 | 发布年份 | 核心变更 | 当前状态 |
|---|---|---|---|
| SSL 2.0 | 1995 | 初始版本,有很多安全问题 | 已弃用 |
| SSL 3.0 | 1996 | 修复了一些问题,但仍不安全 | 已弃用(POODLE攻击) |
| TLS 1.0 | 1999 | 本质上就是SSL 3.1 | 已弃用(BEAST攻击) |
| TLS 1.1 | 2006 | 增加对CBC攻击的防护 | 已弃用 |
| TLS 1.2 | 2008 | 引入AEAD等现代加密 | 推荐使用 |
| TLS 1.3 | 2018 | 握手流程、移除不安全算法 | 强烈推荐 |
4.2 SSLv3的噩梦:为什么必须禁用它
你想想看,一个1996年的协议,加密用的是RC4或者CBC模式的3DES。这两样东西在今天看来就跟纸糊的一样。
什么叫POODLE攻击?说白了就是攻击者利用CBC模式的填充字节做手脚,拿到你的cookie。
4.3 TLS 1.0/1.1:该谢幕了
TLS 1.0在2006年就出了1.1版本,但很多人一直拖到2018年才更新。为什么?因为很多银行系统、交换机、医疗设备只支持1.0。
我建议你用OpenSSL的命令查一下自己的服务:
openssl s_client -connect yourserver.com:443 -tls1_0
openssl s_client -connect yourserver.com:443 -tls1_1
如果还能成功握手,说明你的安全团队该加班了。
TLS 1.0最典型的问题是BEAST攻击。嗯,这里要注意:BEAST攻击利用的是CBC模式的IV预测,导致加密的HTTP头能被还原。虽然在2011年被修复了,但修复方案是禁用Cipher Suite——说白了就是关掉一个功能来保住安全。
4.4 TLS 1.2:最广泛使用的版本
2008年发布的TLS 1.2,到今天仍然是主力。我手上三分之二的项目都在用1.2。
TLS 1.2最关键的变化有3点:
- AEAD支持:引入了GCM、CCM等认证加密模式。以前是MAC-then-Encrypt(容易出填充预言攻击),现在可以同时加密和认证。
- 完整的哈希算法灵活性:不再硬编码SHA-1,可以选SHA-256/SHA-384。
- 移除IDEA和DES:这两个算法太老了。
我提醒一句:TLS 1.2的配置粒度非常大——你可以指定用哪个Cipher Suite、哪个椭圆曲线、哪个哈希算法。但这也意味着很容易配错。
4.5 TLS 1.3:革命性升级
2018年发布的TLS 1.3,说白了是一次「大扫除」。它的变化幅度超过了之前所有版本的总和。
- 握手流程减少1-RTT:从2-RTT变成1-RTT,而且还能0-RTT(对于已经连接过的客户端)。速度提升明显。
- 移除了所有非AEAD的Cipher Suite:包括RSA、DH、ECDH(但不包括ECDHE)。
- 强制前向安全性:所有密钥交换必须使用DHE或ECDHE。换句话说,就算私钥被盗,历史会话记录也无法破解。
- 简化了扩展机制:现在用「Key Share」扩展一次性完成密钥协商。
我在测试TLS 1.3时写过一个对比:在延迟50ms的网络下,TLS 1.2完成完整握手需要约150ms,而TLS 1.3只要50ms。快了3倍。
ssl_protocols TLSv1.2 TLSv1.3; 就行。
4.6 版本对比一览表
| 特性 | SSLv3 | TLS 1.0 | TLS 1.1 | TLS 1.2 | TLS 1.3 |
|---|---|---|---|---|---|
| 握手RTT | 2 | 2 | 2 | 2 | 1 (0-RTT) |
| 前向安全性 | 不支持 | 可选 | 可选 | 可选 | 强制 |
| AEAD支持 | 无 | 无 | 无 | 支持 | 唯一选项 |
| 最大Cipher数量 | <10 | 约20 | 约20 | 约40 | 5个 |
| 密钥协商 | RSA/DH | RSA/DH | RSA/DH | RSA/DH/ECDH | DHE/ECDHE only |
| MD5支持 | 是 | 是 | 是 | 否(SHA-1+) | 否 |
| 当前推荐 | 禁用 | 禁用 | 禁用 | 可用 | 强烈推荐 |
4.7 核心变更流程图
下面这张图是我自己总结的TLS版本演进核心路径,从SSLv3到TLS 1.3的关键节点和变更点都标出来了:
4.8 总结:升级路径建议
升级版本这件事,我建议你别一步到位——风险太高。试试灰度升级:先在一个非关键服务上启用TLS 1.3,跑一周看看有没有兼容性问题。
我在项目中遇到的一个典型案例:有个API网关开启了TLS 1.3后,一些2015年之前的老POS机无法连接。最后我只对内部API开1.3,对公网API维持1.2。万事都可以灰度。
nmap --script ssl-enum-ciphers -p 443 yourdomain.com
nmap会自动枚举支持的TLS版本和Cipher Suite,并给出安全评分。
还是那句话:版本不是越新越好,而是越安全越好。在安全性和兼容性之间,找到你业务能承受的平衡点即可。