要让ssl_ciphers真正起作用,必须禁用tls 1.0/1.1及sslv2/v3,剔除rc4、3des等不安全算法,仅保留ecdhe密钥交换、aes-gcm或chacha20-poly1305加密、sha256/sha384摘要的现代套件,并配合ssl_prefer_server_ciphers on、ssl_protocols tlsv1.2 tlsv1.3、ssl_ecdh_curve指令协同生效。

要让 ssl_ciphers 真正起作用、杜绝因老旧算法导致的中间人攻击,关键不是堆砌“高分名字”,而是用对顺序、配齐指令、堵死降级路径。只写一行 ssl_ciphers,其他都不动,等于没配。
明确禁用所有已知风险项
TLS 1.0/1.1、SSLv2/v3 已被 POODLE、BEAST 等漏洞实锤攻破,必须彻底关闭;RC4、3DES、DES、MD5、SHA1、EXPORT、NULL、ANONYMOUS 这些算法也早已被标准弃用。它们不是“不够强”,而是“根本不可信”。
只保留现代安全组合
真正可用的套件必须同时满足四点:
- 密钥交换为 ECDHE(保障前向保密 PFS),禁用 RSA 密钥交换
- 身份认证匹配证书类型(RSA 证书用
ECDHE-RSA-*,ECDSA 证书用ECDHE-ECDSA-*) - 对称加密仅限 AES-GCM 或 ChaCha20-Poly1305(彻底剔除 CBC 模式)
- 摘要算法仅用 SHA256 或 SHA384(SHA1 和 MD5 不允许出现在套件中)
按优先级精准排序,不靠过滤语法
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
⚠️ 切忌混用!RC4:!MD5等过滤语法——它无法覆盖前面已列出的弱套件,源头只选可信项才可靠。
配套三项指令缺一不可
-
ssl_prefer_server_ciphers on;:强制服务端按你排的顺序选,否则客户端可自行降级挑最弱的 -
ssl_protocols TLSv1.2 TLSv1.3;:明确禁用 TLSv1.0/1.1,避免协议降级绕过 AEAD -
ssl_ecdh_curve secp384r1:prime256v1;:指定高效椭圆曲线,提升 ECDHE 性能并兼顾老旧设备兼容
配置完务必实测验证:用 OpenSSL 命令或 SSL Labs 测试工具确认实际协商结果,看是否真用了 ECDHE-RSA-AES128-GCM-SHA256 这类套件,而不是表面看着高级、实际连不上或悄悄回退到弱算法。











