TLS(Transport Layer Security)协议是现代互联网安全的基石。本文聚焦 TLS 1.2 和 TLS 1.3 的核心差异,帮助你理解协议升级的重要性。

TLS 1.2 的工作流程

TLS 1.2 的握手过程需要 2 个 RTT(Round-Trip Time):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
Client                                          Server
  |-------- ClientHello ----------------------->|
  |<------- ServerHello ------------------------|
  |<------- Certificate ------------------------|
  |<------- ServerKeyExchange ------------------|
  |<------- ServerHelloDone --------------------|
  |-------- ClientKeyExchange ----------------->|
  |-------- ChangeCipherSpec ------------------>|
  |-------- Finished -------------------------->|
  |<------- ChangeCipherSpec -------------------|
  |<------- Finished ---------------------------|

使用 OpenSSL 测试 TLS 1.2 连接

1
2
3
4
5
# 测试服务器是否支持 TLS 1.2
openssl s_client -connect www.example.com:443 -tls1_2

# 查看握手详情
openssl s_client -connect www.example.com:443 -tls1_2 -msg

TLS 1.3 的改进

TLS 1.3 将握手简化为 1 个 RTT:

1
2
3
4
5
6
7
8
Client                                          Server
  |-------- ClientHello + KeyShare ------------>|
  |<------- ServerHello + KeyShare -------------|
  |<------- EncryptedExtensions ----------------|
  |<------- Certificate ------------------------|
  |<------- CertificateVerify ------------------|
  |<------- Finished ---------------------------|
  |-------- Finished -------------------------->|

测试 TLS 1.3 连接

1
2
3
4
5
# 测试服务器是否支持 TLS 1.3
openssl s_client -connect www.example.com:443 -tls1_3

# 查看支持的 TLS 1.3 加密套件
openssl ciphers -v -s -tls1_3

核心差异对比

特性 TLS 1.2 TLS 1.3
握手延迟 2 RTT 1 RTT
加密套件 多种(含不安全) 仅 5 种强加密
前向保密 可选 强制
零 RTT 不支持 支持(有重放风险)
不安全算法 RSA 密钥交换、CBC 模式等 完全移除

TLS 1.3 支持的加密套件

1
2
# 列出 TLS 1.3 加密套件
openssl ciphers -v -s -tls1_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.3 移除了以下不安全的特性:

  • RSA 密钥交换:可能导致前向保密丢失
  • CBC 模式加密:存在 BEAST、Lucky13 等攻击
  • MD5 和 SHA-1 哈希:哈希碰撞风险
  • 压缩:CRIME 攻击向量
  • 重协商:可能导致中间人攻击

配置 Nginx 启用 TLS 1.3

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
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_prefer_server_ciphers on;
    ssl_ciphers TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256;
}

测试配置:

1
2
3
4
5
6
7
8
# 检查 Nginx 配置语法
nginx -t

# 重载配置
nginx -s reload

# 验证 TLS 1.3 是否生效
openssl s_client -connect example.com:443 -tls1_3 < /dev/null 2>&1 | grep "Protocol"

参考来源