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 不支持 支持
安全性 足够用 更强

迁移建议

  1. 保持 TLS 1.2 兼容:部分旧客户端不支持 TLS 1.3
  2. 优先 TLS 1.3:配置中 TLS 1.3 放前面
  3. 测试兼容性:上线前测试主流客户端
  4. 监控统计:统计 TLS 版本使用情况
1
2
# 推荐配置
ssl_protocols TLSv1.2 TLSv1.3;

参考来源