在每个https server块中配置ssl_protocols tlsv1.2 tlsv1.3并配合强ssl_ciphers和ssl_prefer_server_ciphers on,才能彻底禁用不安全协议与弱加密套件,且需逐站配置、实测验证。

直接在每个启用 HTTPS 的 server 块中写入 ssl_protocols TLSv1.2 TLSv1.3;,就能彻底关闭 SSLv2、SSLv3、TLSv1.0 和 TLSv1.1 ——Nginx 不会协商未列出的协议,不支持即握手失败,没有降级可能。
必须放在 server 块内,不能放错位置
该指令只在 server { } 块中生效,写在 http 或 location 块里语法虽能通过,但实际无效。如果你有多个域名或多个 HTTPS 站点(比如 sites-enabled/ 下多个配置文件),每个 server 块都得单独加这一行。
- ✅ 正确示例:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /path/fullchain.pem;
ssl_certificate_key /path/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
} - ❌ 错误写法:漏掉分号、大小写错误(如
tlsv1.2)、空格混乱,或写成ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;(含 TLSv1.0)
仅禁协议不够,必须同步收紧加密套件
TLSv1.2 允许大量弱算法,单靠 ssl_protocols 无法阻止客户端选 RC4、3DES、SHA1 等高危套件。需配合以下设置:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 明确指定强密钥交换与认证方式:
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 && nginx -s reload 后,用命令确认旧协议是否真被拦截:
- 测试 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
常见误区提醒
这些做法看似省事,实则埋下风险:
-
ssl_protocols all;或留空 → 依赖默认值,旧版 Nginx 默认含 TLSv1.0 -
ssl_protocols TLSv1.3;单独启用 → 切断 Android 7–9、部分 Java 应用等主流客户端 -
ssl_protocols TLSv1;→ 这是模糊宏,等价于 TLSv1.0,会意外开启不安全版本










