密码套件 (Cipher Suite,加密套件)
定义
密码套件是 TLS 客户端和服务器协商使用的一组命名的加密算法组合,例如 TLS_AES_128_GCM_SHA256,决定连接用什么算法保护数据。
密码套件是 IANA TLS 注册表中的一项,用两字节编号标识,规定一条连接使用哪些算法。在 TLS 1.2 及更早版本中,名称会写全密钥交换、身份认证、对称加密和 MAC/PRF 哈希:TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 表示 ECDHE 密钥交换、RSA 签名认证、AES-128-GCM 加密、SHA-256 哈希。到了 TLS 1.3,套件只描述 AEAD 算法和哈希(如 TLS_AES_128_GCM_SHA256),密钥交换和签名算法另行协商。
为什么重要
客户端提供列表,服务器从中选一个。即使协议版本没问题,弱套件(RC4、3DES、NULL、出口级、静态 RSA 密钥交换)也会留下攻击面;双方没有交集时握手直接失败,Chrome 显示 ERR_SSL_VERSION_OR_CIPHER_MISMATCH。另外同一套件在不同软件里名字不同:IANA 名 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 在 OpenSSL 里叫 ECDHE-RSA-AES128-GCM-SHA256,TLS_RSA_WITH_3DES_EDE_CBC_SHA 叫 DES-CBC3-SHA。Nginx、宝塔面板用的是 OpenSSL 名称,Java 和 Windows 一般用 IANA 名称,对照时要注意。
例子
展开一个 OpenSSL 套件字符串,看它实际启用了哪些套件:
openssl ciphers -v 'ECDHE+AESGCM'
每行依次显示 OpenSSL 名称、最低协议版本、密钥交换(Kx)、认证(Au)、加密(Enc)和 MAC,AEAD 套件显示 Mac=AEAD。
常见误区
- 名称里数字越大越安全。 AES-128 和 AES-256 都足够强。AES256-SHA(静态 RSA、CBC)反而不如 ECDHE-RSA-AES128-GCM-SHA256,因为前者既没有前向保密也不是 AEAD。
- ECDHE-ECDSA 套件适用于任何证书。 TLS 1.2 中认证算法必须与证书密钥类型一致,RSA 证书只能用 RSA 认证的套件。
- 服务器必须强制自己的套件顺序。 如果启用的套件都足够强,让客户端自选反而更好,没有 AES 硬件加速的设备可以选 ChaCha20-Poly1305。