ssl_prefer_server_ciphers off是推荐配置,因现代客户端具备安全套件选择能力,配合严格定义的ssl_ciphers列表(如ECDHE-GCM/CHACHA20)和显式限定TLSv1.2/TLSv1.3,可在保障前向保密与AEAD加密前提下实现最优兼容性与安全性。

直接在 nginx.conf 或站点 server 块里配置 HTTPS 安全算法套件,核心是用好 ssl_ciphers、ssl_protocols 和 ssl_prefer_server_ciphers 这三个指令。重点不是堆砌“最强”算法,而是剔除已知风险项,明确限定现代协议,并确保前向保密生效。
明确启用 TLS 1.2 和 TLS 1.3,禁用所有旧协议
不能只写 ssl_protocols TLSv1.2; 或依赖默认值。必须显式声明且排除不安全版本:
-
ssl_protocols TLSv1.2 TLSv1.3;—— 只允许这两个版本,TLS 1.0/1.1 已被主流标准弃用 - 确认 Nginx 编译所用 OpenSSL ≥ 1.1.1w(执行
nginx -V | grep openssl查看) - 若 OpenSSL 版本过低,TLS 1.3 将不可用,即使写了也不会生效
使用 ECDHE 开头的套件,强制前向保密
静态 RSA 密钥交换不具备前向保密能力,一旦私钥泄露,历史通信可被解密。必须全部替换为 ECDHE 类型:
- 推荐配置(兼顾安全与主流兼容):
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384; - 该列表不含 RC4、DES、3DES、MD5、SHA1、NULL、EXPORT 等已被淘汰或存在漏洞的算法
- 全部使用 AEAD 模式(如 GCM),保障加密与完整性一体验证
TLS 1.3 需要额外配置 ciphersuites
仅靠 ssl_ciphers 无法控制 TLS 1.3 的专用套件。OpenSSL 1.1.1+ 引入了独立指令:
ssl_conf_command Ciphersuites TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256;- 这条指令必须写在
ssl_certificate和ssl_certificate_key之后,否则无效 - 它只影响 TLS 1.3 握手,不影响 TLS 1.2;两者需分别管控
关闭服务端优先协商,让客户端决定最优套件
ssl_prefer_server_ciphers off; 是关键一环:
- 设为
on时,服务器强行按自己列表顺序选套件,可能忽略客户端更优支持 - 设为
off(推荐),由客户端根据自身能力选择最安全且双方都支持的套件 - 配合严格定义的
ssl_ciphers列表,既保安全又不牺牲兼容性
配置完成后,用 openssl ciphers -v 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256' | wc -l 验证是否解析出有效套件数;再通过在线工具(如 SSL Labs Test)实测评级。安全不是一劳永逸,但这套配置已覆盖当前合规要求的核心底线。


















