直接在每个启用 https 的 server 块中写入 ssl_protocols tlsv1.2 tlsv1.3; 即可严格禁用 tlsv1.0 和 tlsv1.1,该指令仅在 listen 443 ssl 的 server 块内生效,须配合强加密套件、ssl_prefer_server_ciphers on 及实测验证。

直接在每个启用 HTTPS 的 server 块中写入 ssl_protocols TLSv1.2 TLSv1.3;,就能严格禁用 TLSv1.0 和 TLSv1.1。这不是可选优化,而是当前安全合规的硬性要求。
必须放在 server 块里才生效
ssl_protocols 指令只在带 listen 443 ssl 的 server { } 块内有效。写在 http 或 location 块中,语法可能通过,但实际完全不生效。
- 每个监听 443 并启用 SSL 的虚拟主机都要单独加这一行
- 多个域名或多个配置文件(如
sites-enabled/下的各 conf)需逐个检查、逐一添加 - Nginx 不会从父级继承 SSL 协议设置,不能依赖“一次配置,全局生效”
写法必须精准,不能含糊
只留 TLSv1.2 和 TLSv1.3,等于明确排除所有旧协议:SSLv2、SSLv3、TLSv1.0、TLSv1.1。
- ✅ 正确:
ssl_protocols TLSv1.2 TLSv1.3; - ❌ 错误:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;(TLSv1等价于 TLSv1.0,会意外开启) - ❌ 错误:
ssl_protocols all;或留空(旧版 Nginx 默认含 TLSv1.0) - ❌ 错误:
ssl_protocols TLSv1.2+;(Nginx 不支持通配写法)
禁用协议只是第一步,必须同步收紧加密套件
即使协议受限,客户端仍可能用弱 cipher 建立 TLSv1.2 连接,导致前向保密缺失或易受攻击。
- 指定强密钥交换与认证方式:
ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384"; - 禁用含 RC4、MD5、SHA1、DES、3DES 的所有套件
- 启用服务端优先策略:
ssl_prefer_server_ciphers on;,防止客户端绕过服务器策略选择弱算法
改完必须实测,不能只靠 nginx -t
配置重载后,务必用工具验证是否真正禁用成功:
- 测试 TLSv1.1 是否被拒:
openssl s_client -connect example.com:443 -tls1_1 -servername example.com→ 应返回握手失败或连接拒绝 - 测试 TLSv1.2 是否可用:
openssl s_client -connect example.com:443 -tls1_2 -servername example.com→ 输出中应显示Protocol : TLSv1.2 - 用
nmap --script ssl-enum-ciphers -p 443 example.com查看完整支持列表,确认无 TLSv1.0/TLSv1.1 区块 - 访问 SSL Labs Test,检查 “Protocol Support” 部分是否仅显示 TLS 1.2 和 TLS 1.3











