Nginx启用强加密套件需同时满足四点:ECDHE密钥交换、证书类型匹配、AES-GCM或ChaCha20-Poly1305对称加密、SHA256/SHA384摘要算法,并配套ssl_prefer_server_ciphers on、ssl_protocols TLSv1.2 TLSv1.3、ssl_ecdh_curve指令。

要让 Nginx 真正用上强加密套件,不能只靠“看着高级”的算法名称,关键在于排序逻辑、协议协同和指令配套。光写一行 ssl_ciphers,其他都不配,基本等于没设。
只保留现代安全组合
真正可用的套件必须同时满足四点:
- 密钥交换为 ECDHE(保障前向保密),禁用 RSA 密钥交换
- 身份认证匹配证书类型:RSA 证书用
ECDHE-RSA-*,ECDSA 证书用ECDHE-ECDSA-* - 对称加密仅限 AES-GCM 或 ChaCha20-Poly1305(彻底剔除 CBC 模式)
- 摘要算法只用 SHA256 或 SHA384(禁用 SHA1、MD5)
明确剔除所有已淘汰项:RC4、3DES、DES、EXPORT、NULL、ANONYMOUS、MD5、SHA1、TLSv1.0、TLSv1.1。
按 TLS 版本分段精准排序
Nginx 协商时从左到右逐个尝试,第一个客户端支持的即生效。推荐顺序如下(以 RSA 证书为例):
-
TLS 1.3 套件前置(Nginx 1.13+):
TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256 -
TLS 1.2 主力套件紧随其后:
ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305 -
兜底兼容项(如需支持 Android 5 / IE11)加在末尾,且用冒号开头:
:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384
⚠️ 切忌混写:不要把 DHE、CBC 套件(如 AES256-SHA)穿插在 ECDHE 套件中间,它们计算开销大,还可能触发静默降级。
必须同步启用三项核心指令
ssl_ciphers 单独存在是无效的,以下三项必须一起配置:
-
ssl_prefer_server_ciphers on;—— 强制服务端按你写的顺序选套件;否则客户端可自行挑最弱可用项 -
ssl_protocols TLSv1.2 TLSv1.3;—— 明确禁用 TLSv1.0/1.1,堵死协议降级路径 -
ssl_ecdh_curve secp384r1:prime256v1;—— 指定高效椭圆曲线,提升 ECDHE 性能并兼顾兼容性;旧版 Windows 可简化为prime256v1
验证是否真正生效
配置完务必实测:
- 用
openssl s_client -connect example.com:443 -tls1_2或-tls1_3手动测试 - 提交到 SSL Labs 获取详细协商报告
- 确认日志中
$ssl_protocol $ssl_cipher记录的是类似TLSv1.3 TLS_AES_256_GCM_SHA384或TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384这样的结果
不复杂但容易忽略:强密码套件不是“写出来就生效”,而是“排好序 + 限好协议 + 授权服务端选 + 选对曲线”四者齐备的结果。











