Nginx需通过ssl_ciphers排序并启用ssl_prefer_server_ciphers on,配合禁用弱协议(TLSv1.0/1.1)、指定安全椭圆曲线(secp384r1:prime256v1)及TLSv1.2+,才能优先使用ECDHE+AES-GCM或ChaCha20-Poly1305等强加密套件。

要让 Nginx 优先使用强加密套件,关键不是简单罗列几个高分算法,而是通过 ssl_ciphers 指令合理排序,并配合其他 SSL/TLS 相关配置共同生效。
明确目标:只启用现代、安全、经过验证的加密套件
避免使用已知存在风险的算法(如 RC4、DES、3DES、MD5、SHA1),禁用不支持前向保密(PFS)或密钥交换强度不足的套件(如基于 RSA 密钥交换的套件)。优先选择 ECDHE + AES-GCM 或 ChaCha20-Poly1305 组合。
- 推荐基础配置(兼容主流现代浏览器和客户端):
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305; - 若需兼顾较老客户端(如 Android 4.4.2、Java 7u25),可追加部分兼容项,但应放在末尾,确保强套件仍优先:
:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA;
必须配合 ssl\_prefer\_server\_ciphers on
Nginx 默认不强制服务端套件顺序;即使 ssl_ciphers 排好了,客户端仍可能按自己偏好选弱套件。开启该指令后,Nginx 才会以自身配置的顺序为权威依据进行协商。
- 在
http或server块中添加:ssl_prefer_server_ciphers on; - 该设置对 TLS 1.3 无效(其套件由协议硬性规定),但对 TLS 1.2 及更早版本至关重要。
搭配 ssl\_protocols 和 ssl\_ecdh\_curve 提升整体安全性
ssl_ciphers 的效果依赖于协议版本与密钥交换机制的支持程度。
- 禁用不安全旧协议:
ssl_protocols TLSv1.2 TLSv1.3;(不建议启用 TLSv1.0/1.1) - 指定高效且抗侧信道的椭圆曲线(提升 ECDHE 性能与安全性):
ssl_ecdh_curve secp384r1:prime256v1;(优先 secp384r1,fallback prime256v1)
验证是否生效
配置完成后务必测试,不能仅凭语法检查判断。
- 使用在线工具如 SSL Labs Server Test 查看“Handshake Simulation”中各客户端实际协商到的套件,确认强套件被优先选用。
- 命令行快速验证(需 openssl 1.1.1+):
openssl s_client -connect yourdomain.com:443 -tls1_2 -cipher 'ALL:COMPLEMENTOFALL' 2>/dev/null | grep Cipher
观察返回的 Cipher 行是否符合预期(如ECDHE-RSA-AES128-GCM-SHA256)。










