首页/安全/加密与证书速查/CBC 套件退场与 MAC-then-Encrypt 风险
TLS 与 HTTPS60 条

CBC 套件退场与 MAC-then-Encrypt 风险

TLS 1.2 的 CBC 套件因填充与时序问题反复出现攻击(如 Lucky13、POODLE),运维做法是只保留 AEAD 套件,并把协议基线保持在 1.2 及以上。

加密与证书速查安全更新于 2026-10-13

CBC 套件为何退场

TLS 1.2 的 CBC 套件采用「先认证后加密」结构,配合 CBC 的填充校验方式,历史反复被填充与时序类攻击利用(Lucky13、POODLE 类问题)。TLS 1.3 已彻底移除全部 CBC 套件,只保留 AEAD。当下运维做法很明确:即使停留在 TLS 1.2,也只保留 AEAD 组合(AES-GCM、ChaCha20-Poly1305),把协议基线保持在 1.2 及以上。

基本信息

问题根源MAC-then-Encrypt 结构加 CBC 填充,形成可探测的填充与时序差异
TLS 1.3 处理移除全部 CBC 套件,仅保留 AEAD
TLS 1.2 处置套件白名单只保留 ECDHE 与 AEAD 组合
常见残留AES128-SHA、AES256-SHA 等老条目仍留在旧配置模板里
验证方式用 s_client 逐版本确认实际协商结果

典型使用场景

  • 安全基线整改:清理沿用多年的 nginx / apache 套件模板
  • 等保与合规测评中的「弱套件」整改项销项
  • 老客户端兼容评估:确认哪些终端只能走 CBC,单独安排入口
  • 上线前回归:逐版本验证协商结果与预期白名单一致
  • 事故复盘:结合抓包确认当时的会话是否落在 CBC 套件上

白名单与验证

白名单与验证
# nginx:只保留 ECDHE + AEAD 组合
# ssl_ciphers 'ECDHE+AESGCM:ECDHE+CHACHA20';
# apache:SSLCipherSuite ECDHE+AESGCM:ECDHE+CHACHA20
openssl s_client -connect example.com:443 -tls1_2 </dev/null 2>&1 | grep 'Cipher is'
# 构造只支持 CBC 的客户端,确认服务端已拒绝
openssl s_client -connect example.com:443 -tls1_2 -cipher 'AES128-SHA' </dev/null 2>&1 | grep -iE 'cipher|alert|error' | head -3

常见残留与处理

残留项风险处理
AES128-SHA / AES256-SHACBC 加 SHA-1,属弱套件清单从白名单移除
3DES 套件64 位分组,存在 Sweet32 类问题移除,仅对清单内老终端例外
RC4 套件已被实践攻破立即移除
RSA 密钥传输无前向安全逐步替换为 ECDHE 组合
遗留客户端只支持 CBC 时,常见做法是给这些终端单独的域名或入口,并设置限时豁免,而不是让主站整体降级。豁免要有到期时间与复核记录,否则临时措施会长年存在。
基线参考:RFC 8996 已弃用 TLS 1.0 与 1.1,新部署应从 1.2 起步并优先 1.3;1.2 的套件按「ECDHE 密钥交换 + AEAD 加密 + SHA-256 及以上摘要」筛选,即可覆盖绝大多数客户端并避开 CBC 相关攻击面。
排查顺序参考:先用 s_client 试出服务端仍可协商的最弱套件,再核对 nginx 的 ssl_ciphers 与 openssl 版本默认值是否一致;部分 JDK 与老客户端库自身可用套件集合受限,验证时要覆盖真实客户端类型,而不是只用命令行工具。

易错点

  • 以为禁用 3DES 就等于排除了 CBC → AES-CBC 套件仍在列表里,必须显式检查白名单
  • 直接沿用旧配置模板 → CBC 甚至 RC4 仍被启用,测评直接扣分
  • 白名单收得太窄且未做客户端回归 → 大批量终端无法连接,业务中断
  • 只在测试环境验证 → 生产模板与测试模板不同步,上线结果与预期不符

数据来源与参考

  • RFC 8446 §1.2(相对 1.2 的主要差异,移除 CBC)
  • RFC 7457(已知攻击与缓解)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌