必须在upstream或location块中配置proxy_ssl_protocols TLSv1.2 TLSv1.3,禁用TLSv1.0/TLSv1.1;同步启用proxy_ssl_verify on、proxy_ssl_server_name on、强cipher白名单及可信证书校验,确保Nginx连接后端HTTPS服务时符合PCI DSS等合规要求。

要让 Nginx 反向代理层满足 PCI DSS、NIST SP 800-52r2、等保2.0 等最新合规要求,proxy_ssl_protocols 必须精准配置在 upstream 或 location 块中,仅启用 TLSv1.2 和 TLSv1.3,并同步收紧证书校验、SNI 和加密套件行为——它不控制浏览器连 Nginx 的协议,只管 Nginx 主动连后端 HTTPS 服务时用什么协议。
必须写对作用域和值
该指令不能放在 http 或 server 块顶层,否则无效。只在实际使用 proxy_pass https:// 的上下文中配置:
- 推荐方式:在
upstream块内直接设置,便于复用和审计 - 正确写法:
proxy_ssl_protocols TLSv1.2 TLSv1.3; - 禁止出现:
TLSv1、TLSv1.1、SSLv3等任何旧版本标识 - Nginx 1.19.4+ 已默认移除 TLSv1 支持,但显式排除仍是合规审计硬性要求
必须配套启用证书强校验
光禁协议不够,不验证后端证书等于裸奔。四项指令需共存于同一作用域:
-
proxy_ssl_verify on;—— 打开校验开关(默认是 off) -
proxy_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;—— 指向可信根证书包;若后端用私有 CA,需把其根证书追加进该文件 -
proxy_ssl_name "api.example.com";—— 显式指定目标域名,用于匹配证书 SAN 字段;不能用$host替代 -
proxy_ssl_server_name on;—— 启用 SNI,确保多域名后端或云服务能正确路由
必须限制加密套件并关闭降级路径
防止协商出弱 cipher 导致整体安全失效:
- 用
proxy_ssl_ciphers明确白名单,例如:"ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384" - 避免使用含
SHA1、RC4、DES的套件 - 设
proxy_ssl_prefer_server_ciphers off;(默认即 off),确保优先采用 Nginx 提供的强套件 - 如需强制 TLS 1.3,应单独写
proxy_ssl_protocols TLSv1.3;,且proxy_ssl_ciphers改为 TLS 1.3 原生组合:"TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256"
验证是否真正生效
配置 reload 后,不能只信语法检查,要实测链路行为:
- 在 Nginx 服务器上执行:
openssl s_client -connect api.example.com:443 -tls1_2 -servername api.example.com(应成功) - 同样命令换
-tls1_1应失败,返回protocol is down - 检查 error log,关注
SSL_do_handshake() failed、certificate verify failed等关键错误 - 对上游 IP 抓包分析 ClientHello,确认
supported_versions扩展中只含 1.2 和/或 1.3


















