核心是精简、分层、硬件适配:仅保留AES-GCM与ChaCha20两类AEAD套件,严格区分TLS 1.2/1.3配置,禁用所有非AEAD模式,启用服务端优先协商并限定协议版本为TLSv1.2及以上。

核心是精简、分层、硬件适配:只保留现代 AEAD 套件(AES-GCM / ChaCha20),严格区分 TLS 1.2 与 TLS 1.3 配置,禁用所有非 AEAD 模式(如 CBC、RC4、3DES),并确保服务端主导协商。
只留真正高效且被硬件加速的套件
现代 x86 CPU(Intel i3+ / AMD Ryzen 起)普遍支持 AES-NI 指令集,AES-GCM 加解密比 AES-CBC 快 3–5 倍;ARM 或旧设备则更依赖 ChaCha20-Poly1305。因此应聚焦以下两类组合:
- ECDHE-ECDSA-AES128-GCM-SHA256 和 ECDHE-RSA-AES128-GCM-SHA256(主流兼容性好,性能优)
- ECDHE-ECDSA-CHACHA20-POLY1305 和 ECDHE-RSA-CHACHA20-POLY1305(弱硬件友好,移动端友好)
- 完全剔除 AES-CBC(如 ECDHE-RSA-AES128-SHA)、RC4、3DES、MD5/SHA1 签名套件——它们既无硬件加速,又存在已知漏洞(如 Lucky13)
按 TLS 版本分层配置,避免混用降级
TLS 1.3 和 TLS 1.2 的套件机制完全不同:TLS 1.3 内置五种硬编码 AEAD 套件,不识别传统命名;而 TLS 1.2 才真正依赖 ssl_ciphers 的协商顺序。混写会导致客户端 fallback 或静默失败。
- TLS 1.3 套件必须以 TLS13- 开头,且放在列表最前:如
TLS13-AES-128-GCM-SHA256:TLS13-CHACHA20-POLY1305-SHA256 - TLS 1.2 套件紧随其后,仅限 ECDHE + AEAD 组合,总数控制在 6–8 个以内
- 完整推荐写法:
ssl_ciphers 'TLS13-AES-128-GCM-SHA256:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305';
强制服务端主导,关闭老旧协议
默认情况下,客户端可提出任意套件(包括你已禁用的弱算法),导致协商绕过你的优化逻辑。
- 启用
ssl_prefer_server_ciphers on;—— 这对 TLS 1.2 至关重要,确保 Nginx 按你写的顺序严格匹配 - 明确声明协议版本:
ssl_protocols TLSv1.2 TLSv1.3;,彻底禁用 TLS 1.0/1.1(它们不支持 AEAD,强制使用慢速 CBC) - 注意:
ssl_prefer_server_ciphers对 TLS 1.3 无效,但不影响其安全性——TLS 1.3 本身只允许 AEAD
验证是否真正生效
改完配置不验证,等于没调。重点确认两点:是否命中 GCM/ChaCha20,是否避开 CBC 和 SHA1。
- 命令行快速检查:
openssl s_client -connect yourdomain.com:443 -tls1_2 | grep Cipher,输出应为类似Cipher : ECDHE-RSA-AES128-GCM-SHA256 - 再测 TLS 1.3:
openssl s_client -connect yourdomain.com:443 -tls1_3 | grep Cipher,应显示TLS_AES_128_GCM_SHA256或TLS_CHACHA20_POLY1305_SHA256 - 配合在线工具(如 SSL Labs)做全维度扫描,确认无 CBC、无 SHA1、无 TLS 1.0/1.1 回退


















