TLS(Transport Layer Security)协议是 HTTPS 的核心安全保障。从 TLS 1.2 到 TLS 1.3,协议经历了重大改进。本文详细对比两者的主要区别,帮助你理解为什么应该优先使用 TLS 1.3。

握手过程:从 2-RTT 到 1-RTT

TLS 1.2 的完整握手需要两次往返(2-RTT):

1
2
3
4
ClientHello + ServerHello + 证书 + 密钥交换 → 
← ServerKeyExchange + 证书请求 + ServerHelloDone
ClientKeyExchange + 证书验证 + Finished →
← Finished → 应用数据

TLS 1.3 将握手优化为一次往返(1-RTT):

1
2
3
ClientHello + 密钥交换材料 →
← ServerHello + 密钥交换材料 + 证书 + Finished
Finished → 应用数据

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 密码套件:

1
openssl ciphers -v | grep "TLSv1.3"

输出示例:

1
2
3
TLS_AES_256_GCM_SHA384         TLSv1.3 Kx=any      Au=any   Enc=AESGCM(256)            Mac=AEAD
TLS_CHACHA20_POLY1305_SHA256   TLSv1.3 Kx=any      Au=any   Enc=CHACHA20/POLY1305(256) Mac=AEAD
TLS_AES_128_GCM_SHA256         TLSv1.3 Kx=any      Au=any   Enc=AESGCM(128)            Mac=AEAD

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 密钥交换,这意味着如果服务器私钥泄露,历史通信可能被解密。检查当前配置:

1
openssl ciphers -v "TLSv1.2" | grep -E "ECDHE|DHE" | head -5

输出示例:

1
2
3
ECDHE-RSA-AES256-GCM-SHA384    TLSv1.2 Kx=ECDH     Au=RSA   Enc=AESGCM(256)            Mac=AEAD
ECDHE-ECDSA-AES256-GCM-SHA384  TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(256)            Mac=AEAD
DHE-RSA-AES256-GCM-SHA384      TLSv1.2 Kx=DH       Au=RSA   Enc=AESGCM(256)            Mac=AEAD

废弃的算法

TLS 1.3 明确废弃了以下不安全的算法:

废弃的算法 原因
RSA 密钥交换 不支持前向保密
静态 RSA 密钥 不支持前向保密
静态 DH/DHE 密钥 不支持前向保密
CBC 模式加密 容易遭受 BEAST、Lucky Thirteen 等攻击
RC4 流加密 存在偏差攻击
MD5 存在碰撞攻击
SHA-1 存在碰撞攻击
DSA 证书 已被淘汰

0-RTT 模式:性能与安全的权衡

TLS 1.3 引入了 0-RTT 模式,允许客户端在首次握手时就开始发送加密数据:

1
2
# 测试 0-RTT 支持(需要服务器配置)
openssl s_client -connect example.com:443 -tls1_3 -early_data </dev/null

⚠️ 注意:0-RTT 模式存在重放攻击风险,建议仅在低风险场景使用。

性能对比

指标 TLS 1.2 TLS 1.3
握手往返 2-RTT 1-RTT(可 0-RTT)
加密算法 多种(安全不等) 仅 AEAD
前向保密 可选 强制
CPU 负载 较高 较低(优化过的算法)

服务器配置建议

Nginx 配置强制使用 TLS 1.3:

1
2
3
4
5
6
server {
    listen 443 ssl http2;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
}

检查服务器支持的 TLS 版本:

1
2
3
4
5
# 测试 TLS 1.3
echo | openssl s_client -connect example.com:443 -tls1_3 2>&1 | grep "Protocol"

# 测试 TLS 1.2
echo | openssl s_client -connect example.com:443 -tls1_2 2>&1 | grep "Protocol"

总结

TLS 1.3 在安全性、性能和简化性方面都优于 TLS 1.2:

  • 更快:1-RTT 握手甚至 0-RTT
  • 更安全:强制前向保密,仅支持 AEAD 算法
  • 更简单:密码套件从 37 个精简到 5 个

建议所有现代服务器都启用 TLS 1.3,并逐步淘汰 TLS 1.2。


参考来源