1. TLS 1.3 中间人攻击威胁全景

1.1 中间人攻击分类

中间人攻击(Man‑in‑the‑Middle, MITM)是指攻击者在通信双方之间窃听、篡改或注入数据包,而双方却以为直接通信。在 TLS 协议上下文中,MITM 通常发生在以下阶段:

  • 握手阶段——降级协商、伪造证书、密钥交换窃听
  • 数据传输阶段——会话密钥破解、重放、选择性密文修改
  • 会话恢复阶段——会话票据伪造、PSK 窃取
分类典型手段影响面
被动窃听网络嗅探、解密旧会话信息泄露
主动篡改注入恶意证书、修改 ServerHello数据伪造、恶意软件下发
降级攻击强制回退至 TLS 1.2 / 1.1 / 1.0利用旧版本漏洞
会话劫持重用会话 ID / 票据绕过身份验证
侧信道攻击计时、缓存、电磁分析提取私钥或 ephemeral 密钥
关键认知:TLS 1.3 的设计目标之一就是从根本上消除降级攻击和被动窃听的可能性。本章后续将分析其具体防御机制。

1.2 TLS 1.3 防御优势

相比 TLS 1.2 及更早版本,TLS 1.3 在协议层面引入了多项强制安全特性,直接缩小攻击面:

  • 握手加密(1‑RTT 主要模式 + 0‑RTT 可选模式)——所有握手消息在 KeyShare 之后即被加密,避免明文暴露密钥协商参数。
  • 移除不安全密码套件——禁止 RSA 密钥交换、静态 DH、CBC 模式、RC4、3DES 等;仅保留 AEAD 认证加密(AES‑GCM / ChaCha20‑Poly1305)。
  • 签名证书固定(CertificateVerify)——服务器必须以私钥签名整个握手摘要,客户端严格验证。
  • 降级保护机制——使用“降级探测”消息(ServerHello 的 random 字段中特定字节集),客户端检测并拒绝降级。
  • Session Hash 绑定——所有握手消息通过 Transcript Hash 串联,防止重排序或重放。
# 使用 openssl 1.1.1+ 查看 TLS 1.3 支持的密码套件(仅 AEAD)
openssl ciphers -tls1_3 -v | grep Cipher
# 输出示例:
# 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  Mac=AEAD

1.3 常见攻击面(即使使用 TLS 1.3 仍须防御)

虽然协议层大幅加固,但实现与部署中的薄弱环节仍可能被 MITM 利用:

攻击面风险描述防御检查点
证书信任链中间 CA 失陷、自签名证书部署、吊销检查缺失证书固定(HPKP / CAA)、OCSP Stapling
不安全的 0‑RTT 重放恶意重放已加密的 0‑RTT 数据服务端实现反重放缓存、禁止幂等操作
不安全的密钥存储私钥文件权限、HSM 缺失权限 600、使用硬件安全模块
不完整的证书验证未验证 CN / SAN、过期证书、撤销状态自动验证库(如 CertValidator)、定期轮换
密码套件协商降级客户端提供弱套件,服务端误选服务端配置严格白名单,禁止 fallback
侧信道实现泄露计时、缓存、分支预测(如 Lucky13 变体)使用 constant‑time 库、禁用压缩
⚠️ 常见错误:很多部署者仅打开 TLS 1.3 开关,却忽略了证书链验证和 OCSP 检查。例如使用 verify=optional 而非 verify=required,攻击者可利用自签名中间人证书绕过验证。

1.4 威胁全景结构图

TLS 1.3 中间人攻击威胁全景 被动窃听 网络嗅探 解密旧会话 密钥恢复 主动篡改 伪造证书 修改 ServerHello 注入恶意载荷 降级攻击 强制回退协议版本 弱套件诱导 版本号篡改 会话劫持 票据重放 Session ID 复用 PSK 窃取 TLS 1.3 协议防御层 1‑RTT 握手加密 · 降级探测 · 强密码套件 · Transcript Hash 证书信任链 CA 失陷 自签名 0‑RTT 重放 幂等问题 反重放缓存缺失 密钥/实现 私钥权限 侧信道泄漏 验证缺失 CN/SAN 未校验 OCSP 跳过

1.5 检测与诊断常用命令

在排查 MITM 风险时,快速验证客户端与服务端 TLS 1.3 配置的正确性:

# 1. 查看服务端支持的 TLS 版本与密码套件
openssl s_client -connect example.com:443 -tls1_3 -servername example.com

# 2. 检查证书链是否完整
openssl s_client -connect example.com:443 -showcerts

# 3. 验证 OCSP 状态(需服务端支持 staple)
openssl s_client -connect example.com:443 -status

# 4. 用 wireshark 过滤 TLS 1.3 握手包(过滤表达式)
tls.handshake.type == 1 && tls.handshake.version == 0x0304

1.6 部署验收要点

  1. 强制最低版本:服务端配置最低 TLS 1.2,推荐仅启用 TLS 1.3(如 Nginx ssl_protocols TLSv1.3;)。
  2. 密码套件白名单:只保留 TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256。
  3. 证书验证:客户端使用 verify=required 并校验 CN/SAN、有效期、吊销状态。
  4. 0‑RTT 受限:非幂等接口关闭 0‑RTT;服务端实现反重放机制。
  5. 私钥保护:文件权限 600;考虑使用 HSM 或云 KMS 托管。