应采用白名单方式明确列出安全套件,优先TLS1.3的AEAD套件(如TLS13-AES-128-GCM-SHA256),再配TLS1.2的ECDHE-GCM/ChaCha20套件,禁用TLS1.0/1.1,确保前向保密与认证加密,并通过nmap、openssl和浏览器DevTools实测验证。

直接用白名单方式明确列出安全套件,比写一堆 !RC4:!3DES 更可靠。Nginx 不会自动帮你剔除弱算法,它只按你写的列表去协商——没写进去的,客户端根本没法选。
只保留前向保密 + AEAD 的套件
现代安全基线要求所有启用的套件必须同时满足两个条件:支持前向保密(PFS),使用 AEAD 认证加密(如 AES-GCM、ChaCha20-Poly1305)。这意味着要剔除所有含以下成分的套件:
- RSA 密钥交换(非 ECDHE)
- CBC 模式(如
-AES128-SHA、-AES256-CBC-SHA) - SHA1 或 MD5 哈希(末尾是
-SHA或-MD5) - 3DES、RC4、DES、EXPORT、NULL、ANONYMOUS 等已弃用算法
推荐配置写法(兼容 TLS 1.2,TLS 1.3 自动生效)
以下配置已通过 SSL Labs、myssl.com 等主流扫描器验证,兼顾安全性与主流客户端兼容性:
- TLS 1.3 套件放在最前面,确保支持的客户端直接命中
- TLS 1.2 套件紧随其后,按性能优先排序(GCM 在前,ChaCha20 居中)
- 不混用 AES128-GCM 和 AES256-GCM —— 除非业务强依赖 256 位密钥,否则统一用 AES128-GCM 更轻量
- 若用 ECDSA 证书,把
RSA替换为ECDSA即可
必须配套的关键指令
单设 ssl_ciphers 不够,必须协同收紧协议层与协商逻辑:
-
ssl_protocols TLSv1.2 TLSv1.3;—— 彻底禁用 TLSv1.0/v1.1(它们不支持 AEAD) -
ssl_prefer_server_ciphers off;—— TLS 1.3 下该指令无效,但设为on反而可能干扰协商;现代 Nginx 默认值即为off,无需显式写,但建议确认 -
ssl_ecdh_curve secp384r1:prime256v1;—— 避免使用弱椭圆曲线(如sect163k1) - 若曾启用 DHE,需配
ssl_dhparam /etc/nginx/dhparam.pem;,且 DH 参数 ≥3072 位
配置后务必实测验证
改完不测试,等于没改。重点确认两点:是否真用上了 GCM/ChaCha20,是否避开了老旧算法:
- 运行
nmap --script ssl-enum-ciphers -p 443 your-domain.com,输出中不应出现RC4、3DES、SHA(非 SHA256/SHA384)、CBC或标记为weak/broken的条目 - 用
openssl s_client -connect your-domain.com:443 -cipher "3DES" -tls1_2测试,应返回 handshake failed - 浏览器打开 DevTools → Security 标签页,查看 Cipher Suite,应显示类似
TLS_AES_128_GCM_SHA256(TLS 1.3)或ECDHE-RSA-AES128-GCM-SHA256(TLS 1.2)


















