必须在每个监听443的server块中配置ssl_protocols tlsv1.2 tlsv1.3;、ssl_ciphers明确指定前向保密+aead套件并剔除弱算法、ssl_prefer_server_ciphers on;,三者缺一不可,且需配合完整证书链与安全椭圆曲线。

在 Nginx 的 server 块中配置 SSL 协议的安全套件与加密等级,核心是控制 TLS 握手时实际启用的算法组合和协商逻辑。这不是仅靠一行指令就能完成的事,而是一组相互配合的参数共同决定最终安全水位。
必须显式设置 ssl_protocols 并禁用老旧版本
协议版本是安全底线,必须在每个监听 443 的 server 块中单独配置:
-
只保留 TLSv1.2 和 TLSv1.3:写成
ssl_protocols TLSv1.2 TLSv1.3;,不能写TLSv1(等价于 TLSv1.0)或包含 TLSv1.1 - 该指令不继承自
http块,多个 HTTPS 站点需逐个配置,漏一个就存在降级风险 - Nginx 不会自动补全未声明的版本——即使底层 OpenSSL 支持 TLSv1.3,没写进去就不会启用
用 ssl_ciphers 明确指定强套件并严格排序
套件列表不是“支持哪些”,而是“按此顺序优先选用”。客户端只取第一个它支持的:
- 开头必须是前向保密(PFS)+ AEAD 加密组合,例如:
ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305 - 用
!主动剔除已淘汰算法:!RC4:!MD5:!SHA1:!DES:!3DES:!EXPORT:!aNULL:!eNULL - 避免使用模糊宏(如
HIGH),它可能包含不安全组合;也不要把 RSA 密钥交换套件(如AES128-SHA)混入主序列
启用 ssl_prefer_server_ciphers 强制服务端主导
这个开关决定了谁说了算:
- 默认为
off,意味着客户端可绕过你的ssl_ciphers顺序,选它支持的最弱项 - 必须写为
ssl_prefer_server_ciphers on;,且放在同一server块内 - TLSv1.3 不受该指令影响(协议已固化套件),但它对 TLSv1.2 安全至关重要
补充关键参数提升整体强度
单有 cipher 和 protocol 还不够,还需协同加固:
-
ssl_ecdh_curve secp384r1:prime256v1;:指定安全椭圆曲线,防止客户端 fallback 到弱曲线 -
ssl_session_cache shared:SSL:10m; ssl_session_timeout 4h;:启用会话复用,减少重复握手开销 - 确保证书链完整(如 Let’s Encrypt 的
fullchain.pem),否则浏览器直接报错,再强的套件也无效











