TLS 1.3 核心改进#
1. 握手简化#
| 版本 |
握手往返次数 |
握手延迟 |
| TLS 1.2 |
2-RTT |
较高 |
| TLS 1.3 |
1-RTT |
减半 |
TLS 1.3 将握手从 2 个往返减少到 1 个,首次连接更快。
2. 加密套件精简#
TLS 1.3 移除了所有不安全的加密算法,仅保留:
1
2
3
|
TLS_AES_128_GCM_SHA256
TLS_AES_256_GCM_SHA384
TLS_CHACHA20_POLY1305_SHA256
|
不再支持:
- RSA 密钥交换(仅保留 ECDHE)
- CBC 模式
- SHA-1
- RC4、DES、3DES
3. 0-RTT 数据#
恢复会话时可在第一个包发送应用数据:
1
2
|
首次连接:1-RTT
恢复连接:0-RTT(立即发送数据)
|
注意:0-RTT 数据可能被重放,仅适用于幂等请求。
4. 加密握手消息#
TLS 1.3 加密了更多握手消息(如证书),Server Hello 之后全部加密。
验证 TLS 1.3 支持#
使用 OpenSSL#
1
|
openssl s_client -connect cloudflare.com:443 -tls1_3
|
输出:
1
2
|
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Protocol: TLSv1.3
|
查看支持的协议#
1
2
3
4
5
|
# TLS 1.3
echo "Q" | openssl s_client -connect example.com:443 -tls1_3 2>&1 | grep Protocol
# TLS 1.2
echo "Q" | openssl s_client -connect example.com:443 -tls1_2 2>&1 | grep Protocol
|
使用 curl#
1
|
curl -v --tlsv1.3 https://example.com 2>&1 | grep "SSL connection"
|
Nginx 配置 TLS 1.3#
基本配置#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
# 仅 TLS 1.2 和 1.3
ssl_protocols TLSv1.2 TLSv1.3;
# TLS 1.3 加密套件(可选,默认已是最优)
ssl_ciphers TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256;
# 优先服务器加密套件顺序
ssl_prefer_server_ciphers on;
}
|
启用 0-RTT#
1
2
3
4
5
6
|
server {
# ... 其他配置 ...
# 启用 0-RTT(注意重放攻击风险)
ssl_early_data on;
}
|
安全提示:启用 ssl_early_data 时,确保应用能正确处理重放请求。
会话恢复#
1
2
3
4
5
6
7
|
# 会话票据(推荐)
ssl_session_tickets on;
ssl_session_ticket_key /path/to/ticket.key;
# 或会话缓存
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
|
Apache 配置 TLS 1.3#
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<VirtualHost *:443>
ServerName example.com
SSLEngine on
SSLCertificateFile /path/to/cert.pem
SSLCertificateKeyFile /path/to/key.pem
# 启用 TLS 1.3
SSLProtocol -all +TLSv1.2 +TLSv1.3
# 加密套件
SSLCipherSuite TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
</VirtualHost>
|
OpenSSL 版本要求#
| OpenSSL 版本 |
TLS 1.3 支持 |
| 1.1.1+ |
✅ 完整支持 |
| 1.0.2 |
❌ 不支持 |
| 3.0+ |
✅ 完整支持 |
检查版本:
1
2
|
openssl version
# OpenSSL 3.0.18 30 Sep 2025
|
测试 TLS 1.3 配置#
本地测试#
1
2
|
# 启动 Nginx 后测试
openssl s_client -connect localhost:443 -tls1_3 -servername example.com
|
在线测试#
使用 SSL Labs 测试,查看 TLS 1.3 支持情况。
TLS 1.3 vs TLS 1.2 对比#
| 特性 |
TLS 1.2 |
TLS 1.3 |
| 握手往返 |
2-RTT |
1-RTT |
| 加密套件数量 |
30+ |
3 |
| RSA 密钥交换 |
支持 |
移除 |
| 握手消息加密 |
部分 |
全部 |
| 0-RTT |
不支持 |
支持 |
| 安全性 |
足够用 |
更强 |
迁移建议#
- 保持 TLS 1.2 兼容:部分旧客户端不支持 TLS 1.3
- 优先 TLS 1.3:配置中 TLS 1.3 放前面
- 测试兼容性:上线前测试主流客户端
- 监控统计:统计 TLS 版本使用情况
1
2
|
# 推荐配置
ssl_protocols TLSv1.2 TLSv1.3;
|
参考来源#