TLS(Transport Layer Security)协议是 HTTPS 的核心安全保障。从 TLS 1.2 到 TLS 1.3,协议经历了重大改进。本文详细对比两者的主要区别,帮助你理解为什么应该优先使用 TLS 1.3。
握手过程:从 2-RTT 到 1-RTT
TLS 1.2 的完整握手需要两次往返(2-RTT):
|
|
TLS 1.3 将握手优化为一次往返(1-RTT):
|
|
TLS 1.3 还支持 0-RTT 模式,允许在首次连接时就开始发送加密数据,但需要预先共享密钥。
密码套件:简化与安全
TLS 1.3 大幅精简了密码套件,仅保留 5 个基于 AEAD(认证加密)的安全套件:
| 密码套件 | 说明 |
|---|---|
| TLS_AES_256_GCM_SHA384 | AES-256-GCM + SHA-384 |
| TLS_CHACHA20_POLY1305_SHA256 | ChaCha20-Poly1305 |
| TLS_AES_128_GCM_SHA256 | AES-128-GCM + SHA-256 |
使用以下命令可以查看 OpenSSL 支持的 TLS 1.3 密码套件:
|
|
输出示例:
|
|
TLS 1.2 则支持更多传统密码套件,包括 CBC 模式(容易被攻击)和 MD5、SHA-1 等弱哈希算法。
密钥交换:强制前向保密
TLS 1.3 强制使用前向保密(Forward Secrecy),仅支持以下密钥交换方法:
- ECDHE(Elliptic Curve Diffie-Hellman Ephemeral)
- DHE(Diffie-Hellman Ephemeral)
TLS 1.2 允许使用静态 RSA 密钥交换,这意味着如果服务器私钥泄露,历史通信可能被解密。检查当前配置:
|
|
输出示例:
|
|
废弃的算法
TLS 1.3 明确废弃了以下不安全的算法:
| 废弃的算法 | 原因 |
|---|---|
| RSA 密钥交换 | 不支持前向保密 |
| 静态 RSA 密钥 | 不支持前向保密 |
| 静态 DH/DHE 密钥 | 不支持前向保密 |
| CBC 模式加密 | 容易遭受 BEAST、Lucky Thirteen 等攻击 |
| RC4 流加密 | 存在偏差攻击 |
| MD5 | 存在碰撞攻击 |
| SHA-1 | 存在碰撞攻击 |
| DSA 证书 | 已被淘汰 |
0-RTT 模式:性能与安全的权衡
TLS 1.3 引入了 0-RTT 模式,允许客户端在首次握手时就开始发送加密数据:
|
|
⚠️ 注意:0-RTT 模式存在重放攻击风险,建议仅在低风险场景使用。
性能对比
| 指标 | TLS 1.2 | TLS 1.3 |
|---|---|---|
| 握手往返 | 2-RTT | 1-RTT(可 0-RTT) |
| 加密算法 | 多种(安全不等) | 仅 AEAD |
| 前向保密 | 可选 | 强制 |
| CPU 负载 | 较高 | 较低(优化过的算法) |
服务器配置建议
Nginx 配置强制使用 TLS 1.3:
|
|
检查服务器支持的 TLS 版本:
|
|
总结
TLS 1.3 在安全性、性能和简化性方面都优于 TLS 1.2:
- 更快:1-RTT 握手甚至 0-RTT
- 更安全:强制前向保密,仅支持 AEAD 算法
- 更简单:密码套件从 37 个精简到 5 个
建议所有现代服务器都启用 TLS 1.3,并逐步淘汰 TLS 1.2。