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"
|
参考来源#