密码套件是什么
密码套件(cipher suite)是一组算法的命名组合,决定握手阶段用什么做密钥交换与认证、传输阶段用什么做加密。TLS 1.2 的名字把「密钥交换 + 认证 + 加密算法 + 模式 + PRF」全写出来,TLS 1.3 则只保留算法、模式与哈希,密钥交换改由扩展协商。读懂命名是判断配置是否安全的第一步。
基本信息
| TLS 1.2 结构 | TLS_[密钥交换]_[认证]_WITH_[加密]_[模式]_[PRF] |
|---|---|
| TLS 1.2 示例 | TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:临时 ECDH 协商 + RSA 证书签名 + AES-128-GCM + SHA-256 |
| TLS 1.3 结构 | TLS_[加密]_[模式]_[哈希],如 TLS_AES_256_GCM_SHA384 |
| 必须禁用 | NULL、匿名(ADH/AECDH)、EXPORT、RC4、3DES |
| 尽量避免 | CBC 类模式、静态 RSA 密钥传输、SHA-1 |
| 查看工具 | openssl ciphers -v 与 openssl s_client 实际协商结果 |
典型使用场景
- 配置评审:判断一串配置里是否混入了弱套件
- 扫描结果解读:把扫描工具报出的套件名还原成具体算法组合
- 故障排查:握手失败时确认两端可用套件的交集是否为空
- 合规整改:按基线要求收敛到 ECDHE + AEAD 组合
- 版本迁移:理解 1.2 与 1.3 套件结构差异,避免把 1.2 名单套用到 1.3
查询与解读套件
查询与解读套件
# 列出本机 OpenSSL 支持的 ECDHE + AESGCM 套件及含义
openssl ciphers -v 'ECDHE+AESGCM' | head -10
# 统计可用套件总数,评估是否需要收口
openssl ciphers -v 'HIGH:!aNULL' | wc -l
# 查看某个套件的完整属性(密钥交换、认证、加密、强度)
openssl ciphers -v 'ECDHE-RSA-AES128-GCM-SHA256'
# 确认服务端实际协商结果,验证配置是否生效
openssl s_client -connect example.com:443 -tls1_2 </dev/null 2>/dev/null | grep 'Cipher'命名逐段读法
| 片段 | 含义 | 常见误读 |
|---|---|---|
| ECDHE | 临时椭圆曲线密钥交换,提供前向保密 | 误读为证书算法 |
| RSA / ECDSA | 证书签名算法,即认证方式 | 误读为密钥交换方式 |
| AES_128 / AES_256 | 对称加密算法与密钥长度 | 误以为越长越安全,忽略模式 |
| GCM / CBC | 工作模式,决定是否自带完整性 | 忽略 CBC 无认证的属性 |
| SHA256 / SHA384 | PRF 或哈希算法 | 与签名摘要混为一谈 |
套件里的认证部分(RSA 或 ECDSA)指的是证书类型,与密钥交换分离:ECDHE_RSA 表示临时 ECDH 协商密钥、用 RSA 证书做签名认证。确保套件与证书类型匹配,否则会出现协商失败或客户端回退。
套件字符串的语法在不同软件中不同:nginx/OpenSSL 用冒号分隔的表达式,Java 用标准套件名列表,Windows 还有自己的注册表项。迁移配置时要按目标平台重写,直接复制往往导致配置无效或服务启动失败。