要让nginx启用高强度加密套件,须开启ssl_prefer_server_ciphers on并严格按强度从左到右排序ssl_ciphers,优先ecdhe+aes-gcm/chacha20,禁用弱算法及tls1.0/1.1,指定安全曲线并实测验证。

要让 Nginx 真正用上高强度加密套件,关键不是堆砌算法名称,而是控制协商顺序——客户端只认你排在最前面、它又支持的那个套件。
必须开启服务端优先权
默认情况下,TLS 1.2 及更早版本由客户端决定用哪个套件,哪怕你配置了 AES-GCM,老客户端仍可能选上 RSA-SHA 这类不安全的组合。所以第一步是强制把选择权收回来:
- 在 server 或 http 块中明确写入:ssl_prefer_server_ciphers on;
- 该指令默认为 off,不写等于没开
- TLS 1.3 不受此影响(协议已固定套件),但依然要保留,保障 TLS 1.2 安全
套件列表必须从强到弱严格排序
Nginx 按照 从左到右 匹配第一个客户端支持的套件,因此顺序即安全等级。推荐以 ECDHE + AES-GCM / ChaCha20 开头,剔除所有不支持前向保密或已淘汰的算法:
- 推荐写法:ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305";
- 末尾追加兼容项(如需支持 Android 4.4 等)必须用冒号连接,且绝不混入
RSA密钥交换套件(如AES128-SHA) - 主动过滤弱算法:!RC4:!MD5:!SHA1:!DES:!3DES:!EXPORT:!aNULL:!eNULL
配套协议与参数不可少
再好的套件列表,若允许老旧协议或弱密钥交换,仍可能降级协商:
- 禁用不安全协议:ssl_protocols TLSv1.2 TLSv1.3;(务必去掉 TLSv1.0 和 TLSv1.1)
- 指定高效安全椭圆曲线:ssl_ecdh_curve secp384r1:prime256v1;
- 启用会话缓存提升性能:ssl_session_cache shared:SSL:10m; ssl_session_timeout 4h;
验证是否真正生效
重载配置后不能只信 nginx -t,必须实测确认:
- 用
openssl s_client -connect yourdomain.com:443 -tls1_2查看实际协商出的 Cipher - 提交到 SSL Labs 测试,目标评级至少为 A
- 检查是否出现
ECDHE-RSA-AES256-SHA或DHE-RSA-AES128-SHA等低分套件——若有,说明排序或过滤有漏











