核心是删冗余、分层级、验实效:前置tls1.3套件(如tls13-aes-128-gcm-sha256),紧接tls1.2的ecdhe+aead套件(如ecdhe-rsa-aes128-gcm-sha256),同步禁用tls1.0/1.1、启用ssl_prefer_server_ciphers on及ssl_ecdh_curve,并实测验证协商结果。

清理和更新 Nginx 中过时的 TLS 加密套件配置,核心是“删冗余、分层级、验实效”——不是简单替换一串算法名,而是重构 ssl_ciphers 的逻辑结构,并同步调整依赖参数。
识别并移除明确淘汰的套件
以下类型必须从 ssl_ciphers 中彻底删除,它们已被主流浏览器和安全标准弃用:
- TLS 1.0/1.1 相关套件(如
ECDHE-RSA-RC4-SHA、AES256-SHA) - CBC 模式套件(如
ECDHE-RSA-AES256-SHA、DHE-RSA-AES128-SHA),易受 BEAST、Lucky13 等攻击 - SHA-1 哈希套件(含
-SHA但非-SHA256/-SHA384结尾的) - 静态 RSA 密钥交换(如
RSA-AES128-GCM-SHA256),不支持前向保密 - 弱曲线或 DHE 参数(如
DHE-RSA-AES128-GCM-SHA256,计算开销大且无必要)
按协议版本严格分段重写 ssl_ciphers
TLS 1.3 和 TLS 1.2 使用完全不同的协商机制,混写会导致静默降级或握手变慢。必须前置 TLS 1.3 套件,再紧接 TLS 1.2 套件:
-
TLS 1.3 套件(必须放在最前,仅限标准前缀):
TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256 -
TLS 1.2 套件(仅 ECDHE + AEAD 组合):
ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305 - 中间不插入任何其他类型套件,不换行、不空格干扰解析
同步更新关联指令,防止配置失效
仅改 ssl_ciphers 不够,以下参数必须配套调整:
-
ssl_protocols TLSv1.2 TLSv1.3:显式禁用 TLS 1.0/1.1,减少协商分支 -
ssl_prefer_server_ciphers on:对 TLS 1.2 至关重要,确保客户端按你排序选择,而非挑最弱可用项 -
ssl_ecdh_curve secp384r1:prime256v1:避免 OpenSSL 回退低效曲线,兼顾安全性与兼容性 -
ssl_session_cache shared:SSL:10m; ssl_session_timeout 4h:提升会话复用率,降低重复握手负载 -
ssl_stapling on; ssl_stapling_verify on:尤其在 TLS 1.3 下可避免 Safari/iOS 连接延迟
验证是否真正生效,不止语法正确
运行 nginx -t 通过 ≠ 安全达标。必须实测协商结果:
- 用 SSL Labs Server Test 扫描,看是否显示 “TLS 1.3 enabled”、“Key Exchange: ECDHE”、“Cipher Strength: A+”
- 检查日志中是否有
SSL_CTX_set_cipher_list failed报错(说明套件字符串格式非法) - 用
openssl s_client -connect example.com:443 -tls1_2和-tls1_3分别测试,确认返回的Cipher符合预期











