Nginx 的 proxy_ssl_verify 参数值只能为 on 或 off,不接受 "strict" 等字符串;启用校验必须同时配置 proxy_ssl_trusted_certificate、proxy_ssl_name 和 proxy_ssl_server_name,否则返回 502 错误。

nginx 本身没有 proxy_ssl_verify 这个参数
直接搜这个参数名,容易掉进文档误读的坑——Nginx 官方配置项实际叫 proxy_ssl_verify(没错,拼写一致),但它的值只能是 on 或 off,**不接受字符串如 "strict" 或布尔数字**。很多人在配置里写成 proxy_ssl_verify strict,结果 nginx -t 报错:invalid value "strict"。
真正控制“严格校验”的,是它配套的三个指令:
-
proxy_ssl_verify:开关,设为on才启用证书验证 -
proxy_ssl_trusted_certificate:必须指定 PEM 格式的 CA 证书文件路径,不能留空或指向目录 -
proxy_ssl_verify_depth:证书链验证深度,默认 1,后端用自签名或中间 CA 时需调大(比如设为2)
后端是自签名证书时,proxy_ssl_trusted_certificate 必须显式指定
默认情况下,Nginx 不信任任何自签名证书,哪怕你把后端证书内容直接塞进配置也不行。必须把后端服务的根证书(或整个证书链)保存为 PEM 文件,再通过 proxy_ssl_trusted_certificate 指向它。
常见错误操作:
- 只写
proxy_ssl_verify on,没配proxy_ssl_trusted_certificate→ 请求直接 502,error log 显示:SSL_do_handshake() failed (SSL: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed) - 把后端的
server.crt当作 CA 证书传给proxy_ssl_trusted_certificate→ 验证失败,因为自签名证书本身不是 CA - 用了
openssl s_client -connect抓到的证书链,但没合并成单个 PEM(中间证书缺失)→ 验证中断
正确做法:用 openssl x509 -in backend.crt -text -noout 确认是否自签;若是,就把它当 CA 用:cp backend.crt /etc/nginx/ssl/backend-ca.pem,再在配置中引用该路径。
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
开启验证后,proxy_ssl_name 必须匹配后端证书的 SAN 或 CN
即使证书能被信任,Nginx 还会校验域名一致性。默认用 upstream 的 host 名(如 backend.example.com)作为 SNI 和证书校验名。如果后端用 IP 地址或别名访问,而证书里没包含该字段,就会失败。
典型场景和应对:
- upstream 定义为
server 10.0.1.5:443,但证书只有www.api.internal→ 必须加proxy_ssl_name "www.api.internal" - 后端证书含多个 SAN,如
DNS:api.v1, DNS:api.prod,而你 upstream 写的是api.v1→ OK;若写成api-v1→ 失败 - 想跳过域名校验?不行。Nginx 没有类似 curl 的
-k选项;禁用它等于关掉安全验证,不该做
验证失败时,error log 是唯一可靠线索
Nginx 不会在 access log 里记录 SSL 握手失败原因,所有细节都在 error_log(级别至少 info 或 debug)。开启调试前先确认日志路径和级别:
error_log /var/log/nginx/error.log info;
关键错误信息示例:
-
SSL certificate problem: self signed certificate in certificate chain→ 缺少中间证书,补全proxy_ssl_trusted_certificate中的链 -
SSL certificate problem: unable to get local issuer certificate→ 根 CA 未被信任,检查proxy_ssl_trusted_certificate路径和权限(nginx worker 必须可读) -
SSL_do_handshake() failed (SSL: error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed)→ 综合性失败,优先查前两条
注意:proxy_ssl_verify_depth 设太小会导致中间 CA 不被遍历,尤其在 Kubernetes Ingress Controller 或 Istio Sidecar 场景下很常见——这类组件常插入额外证书层,depth 至少设为 2 或 3。

















