密码套件是什么
密码套件(Cipher Suite)是一组算法的编号标识,把密钥交换、身份认证、对称加密、完整性校验四件事打包在一起。ClientHello 携带一个套件列表(TLS 1.2 里按客户端偏好排序,TLS 1.3 只有固定的几个 TLS_AES_* 与 TLS_CHACHA20_* 套件且不排序),ServerHello 用单个字段给出选中项。协商结果就是「客户端列表与目标服务端列表的交集」,交集为空时握手直接失败。
基本信息
| 关键字段 | tls.handshake.ciphersuite(选中)、tls.handshake.ciphersuites(列表) |
|---|---|
| 1.3 套件名 | TLS_AES_128_GCM_SHA256、TLS_CHACHA20_POLY1305_SHA256 等,共五个 |
| 1.2 命名结构 | TLS_密钥交换_认证_WITH_加密_哈希 |
| 适用平台 | Wireshark 4.x / tshark,Linux 与 Windows 表现一致 |
典型使用场景
- 合规核查:等保与 PCI DSS 要求消除 RC4、3DES、CBC 类弱套件
- 定位握手失败:客户端与服务端套件无交集时表现为 handshake_failure(40)
- 核对负载均衡:确认前端与后端各自实际选用的套件是否一致
- 排查「证书有效却握手失败」:套件要求的认证算法与证书类型不匹配
- 升级前后对比:留一份选定套件的基线,验证加固配置真的生效
命令行核对
命令行核对
tshark -r t.pcap -Y "tls.handshake.type==2 && tls.handshake.ciphersuite" -T fields -e ip.src -e tls.handshake.ciphersuite
# 服务端选中项:一行一个目标,便于逐台比对
tshark -r t.pcap -Y "tls.handshake.type==1" -T fields -e ip.src -e tls.handshake.ciphersuites
# 客户端提供的列表,用于判断交集是否为空
tshark -r t.pcap -Y "tls.alert_message.desc==40" # 无共同套件时的典型告警套件名分段读法
| 片段 | 含义 | 判读要点 |
|---|---|---|
| TLS_ | 协议族前缀 | 1.3 与 1.2 前缀相同,不能据此区分版本 |
| ECDHE / RSA / DHE | 密钥交换方式 | ECDHE、DHE 支持前向保密,纯 RSA 密钥交换已不推荐 |
| RSA / ECDSA | 认证与签名算法 | 必须与证书类型匹配,否则列表有交集也会失败 |
| AES_128_GCM / CHACHA20_POLY1305 | 对称加密与模式 | AEAD 模式优先,CBC 已属待淘汰 |
| SHA256 / SHA384 | PRF 与完整性哈希 | SHA1 及以下视为弱 |
| WITH 之后 | 1.3 无此结构 | 1.3 套件不描述密钥交换与认证 |
TLS 1.3 与 1.2 的套件名不可直接比较:1.3 的五个套件不包含密钥交换与认证信息,这两项在 1.3 里由 supported_groups 与签名算法扩展分别协商,统计时必须按版本分开。
客户端侧抓到的套件列表不等于服务端收到的列表。老式负载均衡、防火墙、代理会裁剪或重排套件,排查「明明有交集却失败」时要在两侧同时抓包比对。
加固检查清单
- 禁用 RC4、3DES、DES 与所有 NULL 加密套件
- 优先只留 AEAD 套件:AES-GCM 与 ChaCha20-Poly1305
- 密钥交换优先 ECDHE,兼顾前向保密与性能
- 认证算法与证书类型对齐,避免配置了 ECDSA 套件却只挂 RSA 证书
- 保留一份抓包基线,加固后用同一批客户端复测对比