必须在每个https server块中显式配置ssl_protocols tlsv1.2 tlsv1.3;,该指令仅在server块内生效;需搭配tls 1.3专用套件、禁用弱算法、启用ocsp stapling与hsts,并通过openssl实测验证。

要真正禁用 TLS 1.0 和 1.1、启用 TLS 1.3 并防御常见协议层漏洞,关键不在“加功能”,而在精准控制每个 HTTPS server 块的行为。配置写错位置、漏改虚拟主机、混用旧套件,都会让安全策略形同虚设。
必须在每个 server 块中显式声明协议版本
ssl_protocols 指令只在 server 块内生效,放在 http 或 location 中完全无效——即使 nginx -t 通过,也不会影响实际连接。
- 每个监听 443 ssl 的 server 块都必须单独写: ssl_protocols TLSv1.2 TLSv1.3;
- 不能写成 TLSv1.1 TLSv1.2 TLSv1.3,哪怕只多一个 TLSv1.1,Nginx 就可能降级协商
- 不支持通配符写法(如 TLSv1.2+),也不接受缺分号或大小写错误
密码套件需分层适配,TLS 1.3 必须用专用套件
TLS 1.3 和 TLS 1.2 使用完全不同的加密套件体系。混用会导致浏览器静默降级到 TLS 1.2,甚至握手失败。
- TLS 1.3 专用套件(必须且仅限这些):
ssl_ciphers "TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256"; - TLS 1.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、aNULL、eNULL
- TLS 1.3 下 ssl_prefer_server_ciphers off;(该指令已失效,设为 on 反而干扰协商)
验证是否真正生效,不能只靠语法检查
nginx -t 只校验配置格式,不验证协议行为。未实测=未加固。
- 测试 TLS 1.1 是否被拒:
openssl s_client -connect example.com:443 -tls1_1 -servername example.com(应返回 handshake failure) - 测试 TLS 1.3 是否可用:
openssl s_client -connect example.com:443 -tls1_3 -servername example.com 2>/dev/null | grep Protocol(应显示 Protocol: TLSv1.3) - 用 SSL Labs 扫描,确认协议版本、密钥交换、前向保密全部达标
配套加固不可省略
仅控协议和套件不够,还需补齐关键防护层。
- 启用 OCSP Stapling:
ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /path/to/fullchain.pem; - 强制 HSTS(防降级):
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; - 禁用不安全响应头(如 X-Powered-By)、启用 CSP 和 Referrer-Policy
- 证书链必须完整;私钥权限设为 600;证书使用 ECDSA 或 RSA 2048+/3072+,避免 SHA-1 签名











