开启 ssl_prefer_server_ciphers on 是让 Nginx 在 TLS 1.2 握手时按服务端 ssl_ciphers 顺序优先选择强加密套件,但必须显式配置于 server 块、配合剔除弱算法的严格排序套件(如 ECDHE+AES-GCM/ChaCha20)、限定 TLSv1.2+ 协议及指定安全曲线,并通过 openssl 和 SSL Labs 实测验证才真正生效。
开启
是让 Nginx 在 TLS 1.2 握手时按你设定的顺序选用加密套件,但它本身不提升强度——真正起作用的是你写的
列表是否合理、排序是否靠前、是否剔除了弱算法。
必须显式启用并放在 server 块内
该指令默认是
,不写等于没配。不能只依赖全局 http 块设置,必须确保每个启用 HTTPS 的
块中都包含:
与之配套的
和
避免被 include 文件或低优先级配置覆盖(例如某子域名配置里误设为
)
加密套件要严格排序,开头即最强
静态站点不需要兼容老旧客户端,应把支持前向保密(PFS)、AEAD 模式、低延迟的组合放在最前面:
推荐开头组合:
明确排除弱项:
不要用模糊表达如
或
,它们无法过滤掉非 PFS 套件
协议与密钥交换必须协同限制
再强的套件列表,若允许 TLSv1.0 握手,仍可能降级到弱算法:
只启用:
(TLSv1.3 自动忽略该指令,但保留它保障 TLSv1.2 安全)
指定高效安全曲线:
,兼顾性能与基础兼容性
可选增强:
(2048 位以上,强化 DH 密钥交换)
验证是否真正生效
改完配置后不能只 reload,必须实测确认协商结果:
命令行验证 TLSv1.2 协商:
,输出应是你
中第一个套件
用
SSL Labs
全面扫描,重点看 “Handshake Simulation” 中各客户端是否都协商到 ECDHE+GCM/ChaCha20,且 “Key Exchange” 显示 PFS
检查 Nginx 错误日志,确认无 SSL 相关警告或 fallback 提示
ssl_prefer_server_ciphers onssl_ciphersoffserverssl_prefer_server_ciphers on;ssl_ciphersssl_protocolsoffECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305!RC4:!MD5:!SHA1:!DES:!3DES:!EXPORT:!aNULL:!eNULLHIGH!aNULL:!MD5ssl_protocols TLSv1.2 TLSv1.3;ssl_ecdh_curve secp384r1:prime256v1;ssl_dhparam /path/to/dhparam.pem;openssl s_client -connect yourdomain.com:443 -tls1_2 | grep "Cipher is"ssl_ciphers