首页/安全/加密与证书速查/套件选择与服务端偏好
TLS 与 HTTPS60 条

套件选择与服务端偏好

TLS 1.2 由客户端提交套件列表、服务端可配置优先级;TLS 1.3 固定使用少数 AEAD 套件,且顺序由客户端偏好决定,服务端无法自定义组合。

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

套件选择规则

套件选择规则在 TLS 1.2 与 1.3 中完全不同。1.2 由客户端提交套件列表,服务端可通过偏好开关决定优先级,因此加固时要显式排除 CBC、RC4 等旧组合;1.3 只保留少数 AEAD 套件,顺序以客户端偏好为准,服务端无法自定义组合,证书认证改由签名算法协商。把这个差异分清,才能解释「配置写了却不生效」这类现象。

基本信息

TLS 1.2客户端列表加服务端偏好,需显式排除旧组合
TLS 1.3套件固定为 AES-GCM 与 ChaCha20 系列
nginxssl_ciphers 只作用于 1.2 套件
验证工具openssl ciphers 看语义,s_client 看实际协商

典型使用场景

  • 加固配置:编写套件白名单前先在本地验证表达式是否合法
  • 兼容性排查:客户端握手失败时对比双方可用套件
  • 性能优化:缺少 AES 硬件加速时优先 ChaCha20 组合
  • 合规检查:确认服务端不再协商 CBC、3DES 等旧组合
  • 版本差异确认:核对 1.2 与 1.3 的实际协商结果

查看与限定套件

查看与限定套件
openssl ciphers -v 'ECDHE+AESGCM:ECDHE+CHACHA20' | head -10   # 验证表达式
openssl list -cipher-algorithms | grep -i '^TLS_AES' | head    # 枚举 1.3 套件
openssl ciphers -v 'DEFAULT' | grep -c 'CBC'                   # 统计旧组合数量
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>&1 | grep -i cipher

两个版本的分工

项目TLS 1.2TLS 1.3
套件数量组合众多仅少数 AEAD 套件
选择权服务端可配偏好以客户端顺序为准
密钥交换写在套件名中由支持组单独协商
认证算法写在套件名中由签名算法列表协商
把配置拆成两层理解:1.2 的白名单受套件指令控制,1.3 交给协议默认集合与客户端顺序,排查时就不会困惑为什么写了套件名却不生效。

加固落地步骤

  • 先用 ciphers 命令在本地验证目标表达式能解析
  • 再写入服务端配置并用 s_client 验证实际协商结果
  • 统计日志中的协议与套件分布,评估旧客户端占比
  • 按分布结果分批关闭旧组合,保留可回退的配置版本
关闭全部 CBC 组合前必须先看访问日志中的客户端分布,老旧设备与内嵌系统常只能协商旧组合,一次性关闭会造成批量连接失败。

易错点

  • 在套件配置里写 1.3 套件名却不生效,误判为配置错误
  • 以为配置了服务端偏好就能排除所有弱组合,仍需核对客户端可选集合与库的默认值
  • 删除全部 CBC 套件前未统计客户端分布,导致老客户端彻底无法连接
  • 在不同 nginx 版本间直接复制套件表达式,忽略安全级别与密码库版本差异
  • 只调整套件而未同步调整协议版本,1.2 与 1.3 的加固目标不一致

数据来源与参考

  • RFC 5246 §7.4.1.2(cipher_suites)
  • RFC 8446 §9.1(强制实现的套件)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌