应配置ssl_ciphers为tls13-aes-128-gcm-sha256:tls13-aes-256-gcm-sha384:tls13-chacha20-poly1305-sha256:ecdhe-rsa-aes128-gcm-sha256:ecdhe-rsa-aes256-gcm-sha384:ecdhe-rsa-chacha20-poly1305,并同步设置ssl_protocols tlsv1.2 tlsv1.3、ssl_prefer_server_ciphers on和ssl_ecdh_curve secp384r1:prime256v1。

直接用 ssl_ciphers 指令精选现代加密套件,核心是“只留安全的、按顺序排好、配套指令跟上”,不是堆砌名字或依赖过滤语法。
只保留 ECDHE + AEAD 的组合
现代安全套件必须同时满足:密钥交换用 ECDHE(保障前向保密),对称加密用 AES-GCM 或 ChaCha20-Poly1305(AEAD 模式,防篡改且硬件可加速),摘要用 SHA256 或 SHA384(剔除 SHA1/MD5)。
推荐写法(RSA 证书适用):
-
TLS13-AES-128-GCM-SHA256:TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256(TLS 1.3 套件前置) -
ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305(TLS 1.2 主力) - 完全不写含
-CBC、-SHA(指 SHA1)、RC4、3DES、DHE的套件——它们不是“弱”,而是“不合规”。
顺序即优先级,从左到右协商
Nginx 不会跳过你写的弱项去挑后面的强项。客户端支持第一个就用它,所以最常用、最高效、最兼容的放最左:
- 服务器为主(x86/AMD):把
ECDHE-RSA-AES128-GCM-SHA256放首位(AES-NI 加速效果最好) - 移动端或混合后端:把
ECDHE-RSA-CHACHA20-POLY1305提前(ARM 设备更友好) - 不要混插旧套件,比如在中间加
ECDHE-RSA-AES128-SHA256—— 它虽不用 SHA1,但仍是 CBC 模式,扫描器会标为不安全。
必须同步配置三项基础指令
ssl_ciphers 单独存在等于没配。以下三项缺一不可:
-
ssl_protocols TLSv1.2 TLSv1.3;—— 明确禁用 TLS 1.0/1.1,堵死协议降级路径 -
ssl_prefer_server_ciphers on;—— 强制 Nginx 按你写的顺序选,否则客户端可自行挑最弱可用项 -
ssl_ecdh_curve secp384r1:prime256v1;—— 指定高效椭圆曲线,提升 ECDHE 性能和兼容性
验证是否真正生效
重载配置后,不能只看 nginx -t,要实测协商结果:
- 用 OpenSSL 检查:
openssl s_client -connect your-domain.com:443 -tls1_2 | grep Cipher,输出应为ECDHE-RSA-AES128-GCM-SHA256这类,不能出现AES128-SHA - 打开 debug 日志:
error_log /var/log/nginx/error.log debug;,搜索SSL accepted cipher: - 用 SSL Labs 或 myssl.com 扫描,确认评级为 A+,且报告中无 CBC、SHA1、TLS 1.0/1.1 相关告警











