必须在每个启用 HTTPS 的 server 块中配置 ssl_protocols TLSv1.2 TLSv1.3; 才能禁用 TLS 1.0 和 1.1;该指令在 http 或 location 块中无效,且须配合强加密套件、ssl_prefer_server_ciphers on 及实测验证。

直接在每个启用 HTTPS 的 server 块里写 ssl_protocols TLSv1.2 TLSv1.3;,就能禁用 TLS 1.0 和 1.1。SSL 模块本身是 Nginx 编译时内置的(只要带 --with-http_ssl_module),不需要额外加载,重点在于协议和加密套件的精准配置。
SSL 模块不是“启用”,而是确认已编译支持
Nginx 默认安装通常已包含 SSL 模块。验证方式很简单:
- 运行
nginx -V 2>&1 | grep -o with-http_ssl_module,输出含该字符串即表示支持 - 若无输出,说明编译时未启用,需重新源码编译并加入
--with-http_ssl_module -
注意:模块不需在配置中
load_module,它随listen 443 ssl自动激活
禁用不安全协议必须写在 server 块内
ssl_protocols 指令只在 server 块中生效,放错位置等于没写:
- ✅ 正确位置:
server { listen 443 ssl; ... ssl_protocols TLSv1.2 TLSv1.3; } - ❌ 无效位置:写在
http或location块里,语法能过但实际不生效 - 多个域名或虚拟主机?每个
server块都要单独加这一行,Nginx 不继承 - 大小写、空格、分号必须严格:写成
TLSv1.2 TLSv1.3 ;(末尾空格)或漏掉分号都会导致nginx -t失败
光禁协议不够,必须同步收紧加密套件
即使协议被限制,客户端仍可能协商出弱算法。需配套三项关键配置:
- 指定强密钥交换与认证套件:
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),立即验证是否真正生效:
- 测试 TLS 1.1 是否被拒:
openssl s_client -connect example.com:443 -tls1_1 -servername example.com→ 应返回握手失败或连接拒绝 - 测试 TLS 1.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 区块 - 注意 CDN 或反向代理层(如 Cloudflare)可能透传旧协议,测试前确保直连 Nginx 本机 IP


















