必须在每个启用 https 的 server 块中配置 ssl_protocols tlsv1.2 tlsv1.3; 才能精准禁用 sslv2/sslv3/tlsv1.0/tlsv1.1,该指令在 http 或 location 块中无效,且需配合强加密套件、ssl_prefer_server_ciphers on 及实测验证。

直接在每个启用 HTTPS 的 server 块中写死协议列表,是限制 SSL/TLS 版本最有效且必须的操作。只留 TLSv1.2 和 TLSv1.3,其他全部排除,才能真正切断降级路径和已知漏洞利用可能。
必须放在 server 块里才生效
该配置不能写在 http 或 location 块中——语法能通过,但实际完全不生效。Nginx 不支持继承式 SSL 协议设置,每个监听 443 端口的虚拟主机都需单独声明:
server { listen 443 ssl; ssl_protocols TLSv1.2 TLSv1.3; }- 多个域名、多站点配置时,每个
server都要加这一行 - 不能依赖全局配置,也不能用通配写法(如
TLSv1.2+)
配套禁用弱密码套件
仅限制协议不够,客户端仍可能协商出不安全的 cipher。必须同步收紧加密套件:
- 剔除所有含 RC4、DES、3DES、MD5、SHA1 的套件
- 优先选用 ECDHE 密钥交换 + AES-GCM 组合,例如:
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384'; - 启用服务端优先:
ssl_prefer_server_ciphers on;,防止客户端绕过策略选弱算法
验证是否真正禁用成功
改完配置后必须实测,nginx -t 无法验证协议是否被拒绝:
- 测试 TLSv1.1 是否被拒:
openssl s_client -connect example.com:443 -tls1_1 -servername example.com→ 应返回握手失败 - 测试 TLSv1.2 是否可用 → 输出中应显示
Protocol : TLSv1.2且无错误 - 推荐使用 SSL Labs Test 全面扫描,确认协议与套件实际启用状态
隐藏版本与减少指纹暴露
攻击者常结合协议版本、服务标识、OpenSSL 版本等信息定向利用。除了协议控制,还需降低服务器可识别性:
- 在
http块中添加:server_tokens off;,隐藏 Nginx 版本号 - 避免在响应头中泄露 OpenSSL 或系统细节(如自定义
Server头需谨慎) - 确保 OpenSSL 版本 ≥ 1.1.1w 或 3.0.13+,旧版本即使配置正确也可能存在底层漏洞











