在配置 TLS/SSL 时,我们经常看到类似 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 这样的密码套件名称。对于初学者来说,这串字符可能令人困惑。本文将详细解析 TLS 密码套件的命名规范,帮助你理解每个部分的含义。

什么是密码套件

密码套件(Cipher Suite)是 TLS 协议的核心组件,它定义了一整套加密算法组合,包括:

  • 密钥交换算法
  • 身份认证算法
  • 加密算法
  • 哈希算法

一个密码套件决定了 TLS 握手期间如何协商安全参数,以及如何加密传输的数据。

TLS 1.2 密码套件命名格式

TLS 1.2 采用以下命名格式:

1
TLS_密钥交换算法_认证算法_加密算法_哈希算法

TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 为例:

组成部分 含义
TLS 协议名称
ECDHE 密钥交换算法(Elliptic Curve Diffie-Hellman Ephemeral)
RSA 身份认证算法
AES_256_GCM 加密算法(AES,256位,GCM模式)
SHA384 哈希算法

各组件详解

密钥交换算法(Key Exchange)

  • ECDHE:椭圆曲线临时 Diffie-Hellman(推荐,前向安全)
  • DHE:临时 Diffie-Hellman(传统但性能较低)
  • RSA:基于 RSA 的密钥交换(已被废弃,不提供前向安全)
  • ECDH:椭圆曲线 Diffie-Hellman(静态)

认证算法(Authentication)

  • RSA:RSA 公钥证书
  • ECDSA:椭圆曲线数字签名算法
  • DSS:数字签名标准(较老)

加密算法(Cipher)

  • AES_256_GCM:AES 加密,256位密钥,GCM 模式(推荐)
  • CHACHA20-POLY1305:Google 开发的流密码(移动设备友好)
  • AES_128_CCM:AES 加密,128位密钥,CCM 模式
  • ARIA256-GCM:韩国标准加密算法

哈希算法(MAC/Hash)

  • SHA384:SHA-2 哈希,输出384位
  • SHA256:SHA-2 哈希,输出256位
  • MD5:已废弃,不推荐使用
  • SHA1:已废弃,不推荐使用

TLS 1.3 密码套件命名格式

TLS 1.3 大幅简化了密码套件设计,仅保留加密算法和哈希算法:

1
TLS_加密算法_哈希算法

常见的 TLS 1.3 密码套件:

密码套件 加密算法 哈希算法
TLS_AES_256_GCM_SHA384 AES GCM (256位) SHA-384
TLS_CHACHA20_POLY1305_SHA256 ChaCha20-Poly1305 SHA-256
TLS_AES_128_GCM_SHA256 AES GCM (128位) SHA-256

TLS 1.3 移除了静态 RSA 和 DH 密钥交换,强制使用前向安全的临时密钥交换(ECDHE/DHE)。这意味着所有 TLS 1.3 连接都提供前向安全保护。

对比 TLS 1.2 和 TLS 1.3 密码套件

1
2
3
4
5
6
7
8
TLS 1.2:  TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
           └──┬──┘└──┬──┘└─────┬─────┘└──┬──┘
              │       │         │          │
          密钥交换  认证    加密算法    哈希算法

TLS 1.3:  TLS_AES_256_GCM_SHA384
              └─────┬─────┘└──┬──┘
                 加密算法   哈希算法

查看支持的密码套件

使用 OpenSSL 查看系统支持的密码套件:

1
2
3
4
5
6
7
8
# 查看所有密码套件(详细格式)
openssl ciphers -v 'ALL:eNULL'

# 只查看 TLS 1.3 密码套件
openssl ciphers -v 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256'

# 只查看 TLS 1.2 高安全性密码套件
openssl ciphers -v 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305'

输出示例:

1
2
3
TLS_AES_256_GCM_SHA384         TLSv1.3 Kx=any      Au=any   Enc=AESGCM(256)            Mac=AEAD
TLS_CHACHA20_POLY1305_SHA256   TLSv1.3 Kx=any      Au=any   Enc=CHACHA20/POLY1305(256) Mac=AEAD
ECDHE-RSA-AES256-GCM-SHA384    TLSv1.2 Kx=ECDH     Au=RSA   Enc=AESGCM(256)            Mac=AEAD

字段说明:

  • TLSv1.3:协议版本
  • Kx=ECDH:密钥交换类型
  • Au=RSA:认证算法
  • Enc=AESGCM(256):加密算法
  • Mac=AEAD:消息认证码类型(AEAD = 认证加密)

实际应用:解析密码套件

让我们通过一个实际连接来查看密码套件协商结果:

1
2
3
4
5
# 连接到 example.com 并查看协商的密码套件
openssl s_client -connect example.com:443 -tls1_3 </dev/null 2>/dev/null | grep "Cipher"

# 如果 TLS 1.3 不可用,查看 TLS 1.2
openssl s_client -connect example.com:443 -tls1_2 </dev/null 2>/dev/null | grep "Cipher"

示例输出:

1
2
Cipher    : TLS_AES_256_GCM_SHA384    # TLS 1.3
Cipher    : ECDHE-RSA-AES256-GCM-SHA384    # TLS 1.2

配置建议

推荐配置(TLS 1.3 优先):

1
2
3
4
# Nginx 配置示例
ssl_protocols TLSv1.3 TLSv1.2;
ssl_ciphers 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305';
ssl_prefer_server_ciphers on;

强制高安全性(仅 TLS 1.3):

1
2
ssl_protocols TLSv1.3;
ssl_ciphers 'TLS_AES_256_GCM_SHA384';

兼容旧系统(TLS 1.2 最低要求):

1
2
3
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;

总结

理解密码套件命名规范对于配置安全的 TLS 连接至关重要:

  1. TLS 1.2:采用 TLS_KeyExch_Auth_Cipher_Hash 格式,组件较多
  2. TLS 1.3:采用 TLS_Cipher_Hash 格式,更简洁,安全性更高
  3. 生产环境应优先使用 TLS 1.3 和提供前向安全的密码套件
  4. 避免使用已知不安全的算法(如 3DES、RC4、SHA1)

参考来源