ssl_protocols指令必须在server块中配置且配合listen 443 ssl才生效,http块中设置无效;正确写法为ssl_protocols tlsv1.2 tlsv1.3;,需搭配openssl≥1.1.1等条件。

直接在 http 块里写 ssl_protocols 是无效的——这条指令只能出现在 server 块中,且必须配合 listen 443 ssl 才会生效。想让所有 HTTPS 站点统一强制 TLS 1.2 和 TLS 1.3,就得在每个启用 HTTPS 的 server 块里单独配置。
正确位置:必须放在 server 块内部
nginx 不支持在 http 或 location 中设置 ssl_protocols。即使语法检查通过(nginx -t),实际运行时也会静默忽略,客户端仍可能协商到 TLS 1.1 或更低版本。
- ✅ 正确写法:
server {<br> listen 443 ssl;<br> ssl_protocols TLSv1.2 TLSv1.3;<br> # 其他 ssl 配置...<br>} - ❌ 错误写法:
http {<br> ssl_protocols TLSv1.2 TLSv1.3; # 不生效<br>}
标准写法:只启用 TLSv1.2 和 TLSv1.3
生产环境应明确列出允许的协议,禁用所有旧版本。Nginx 不识别通配符或简写,必须用标准命名格式。
- 推荐配置:
ssl_protocols TLSv1.2 TLSv1.3; - 不能写成
TLSv1.2+、TLSv12或TLSv1.3 only(除非你确认所有客户端都支持) - 若仅写
TLSv1.3,会切断 Android 7–9、IE11、部分 IoT 设备等不支持 TLS 1.3 的访问
配套必要条件:缺一不可
配置再正确,底层不支持也白搭。必须同时满足以下三项:
-
OpenSSL ≥ 1.1.1(如 1.1.1w 或 3.0+):运行
nginx -V 2>&1 | grep OpenSSL查看编译链接的版本;openssl version显示的是命令行工具版本,不能代表 nginx 实际使用版本 - Nginx ≥ 1.13.0(建议 ≥ 1.14.1 或 1.25.0):老版本对 TLS 1.3 支持不完整
-
编译时启用了 TLSv1.3:主流发行版预编译包通常已默认开启;自编译需加
--with-openssl-opt=enable-tls1_3
同步收紧加密与握手行为
光限制协议不够,还需配合加密套件和协商逻辑,防止降级或弱算法被利用:
-
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 后,务必测试关键用户端(如企业内网旧系统、定制硬件)是否仍能正常访问
验证是否生效,可用:openssl s_client -connect example.com:443 -tls1_1(应失败)openssl s_client -connect example.com:443 -tls1_2(应成功)











