错误。ssl_protocols可在http、server块中配置并生效,其中http块配置可统一继承给所有子server块,location中设置则被忽略;必须使用TLSv1.2 TLSv1.3标准写法,禁用旧协议,并配合ssl_ciphers等配置及OpenSSL≥1.1.1验证。

直接在 http 块中配置 ssl_protocols 无法生效——该指令只允许出现在 server 或 location 块内,且必须配合 listen 443 ssl 才起作用。想全局统一强制 TLS 1.2/1.3,需在每个 HTTPS server 块中显式声明,而非 http 层。
必须放在 server 块里才有效
Nginx 不支持在 http 上下文中设置 ssl_protocols。即使写进去,启动时不会报错,但实际不生效,客户端仍可能协商到 TLS 1.1 或更低版本。
- 正确位置:所有启用 HTTPS 的
server { ... }块内部 - 错误写法:
http { ssl_protocols TLSv1.2 TLSv1.3; }→ 忽略 - 验证方式:用
nginx -t检查语法,再用openssl s_client -connect example.com:443 -tls1_1测试是否被拒绝
推荐配置写法与含义
生产环境应明确启用 TLSv1.2 和 TLSv1.3,同时禁用所有旧协议:
-
ssl_protocols TLSv1.2 TLSv1.3;—— 仅允许这两个版本,TLS 1.0/1.1 及更早全部拒接 - 不能写成
TLSv1.2+或TLSv12,Nginx 不识别通配符或简写 - 若只写
TLSv1.3,会切断所有不支持 TLS 1.3 的客户端(如 Android 7–9、IE11、部分 IoT 设备)
配套必须检查的依赖条件
配置生效的前提是底层支持,缺一不可:
- Nginx ≥ 1.13.0(建议 ≥ 1.14.1 或 1.25.0),可通过
nginx -V 2>&1 | grep -i openssl查看编译信息 - OpenSSL ≥ 1.1.1(1.1.1a–1.1.1t 或 3.0+ 均可;1.0.2 / 1.1.0 不支持 TLS 1.3)
- 编译时启用了 TLSv1.3(多数主流发行版预编译包已默认开启;自编译需加
--with-openssl-opt=enable-tls1_3)
避免常见降级风险
光靠 ssl_protocols 不够,还需同步收紧加密套件和握手逻辑:
-
ssl_ciphers应排除弱算法,例如使用:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384 -
ssl_prefer_server_ciphers off;—— TLS 1.3 要求关闭服务端优先,否则可能影响协商 - 禁用 TLS 1.0/1.1 后,务必测试关键用户端(如企业内网旧系统、定制硬件)是否仍能正常访问


















