nginx后端单向证书校验必须同时配置proxy_ssl_verify on、proxy_ssl_trusted_certificate、proxy_ssl_name和proxy_ssl_server_name四项,缺一不可;其中proxy_ssl_certificate仅用于mtls中nginx向后端出示客户端证书,不参与单向校验。

你提到的 proxy_ssl_certificate 并不是用于后端单向验证(即校验后端证书合法性)的指令,而是用于**Nginx 主动向后端提供客户端证书**的配置——这属于 TLS 双向认证(mTLS)场景,和 proxy_ssl_verify 控制的单向验证完全无关。
真正控制后端单向验证的核心是 proxy_ssl_verify 体系
要让 Nginx 安全地校验它所连接的 HTTPS 后端证书是否合法(比如是否过期、域名是否匹配、是否由可信 CA 签发),必须启用并配齐以下四条指令,缺一不可:
- proxy_ssl_verify on; —— 开启校验开关(默认 off,不写等于不校验)
- proxy_ssl_trusted_certificate /path/to/ca-bundle.crt; —— 指定可信根证书文件(PEM 格式,只含 CA 证书,不含私钥或终端证书)
-
proxy_ssl_name "backend.example.com"; —— 显式声明期望的后端域名,用于匹配证书中的 SAN 字段(即使
proxy_pass写的是 IP 或变量,也必须设) - proxy_ssl_server_name on; —— 启用 TLS SNI,确保握手时向后端发送正确域名(否则可能拿到默认/错误证书)
proxy_ssl_certificate 是干什么的?
proxy_ssl_certificate 和 proxy_ssl_certificate_key 是成对出现的,作用是:当后端要求客户端身份认证(即开启 mTLS)时,Nginx 需向后端出示自己的证书+私钥。它不参与、也不影响对后端证书的校验逻辑。
典型用法示例:
location /secure-api/ {proxy_pass https://internal-api/;
proxy_ssl_verify on;
proxy_ssl_trusted_certificate /etc/nginx/ssl/ca-bundle.crt;
proxy_ssl_name "internal-api.company.local";
proxy_ssl_server_name on;
# 以下两行仅在后端强制要求客户端证书时才需要
proxy_ssl_certificate /etc/nginx/ssl/client.crt;
proxy_ssl_certificate_key /etc/nginx/ssl/client.key;
}
常见误区与避坑提示
- 只写
proxy_ssl_verify on;→ 必然 502,Nginx 会静默拒绝连接 - 把
fullchain.pem或server.crt当作proxy_ssl_trusted_certificate的值 → 校验失败,该指令只接受根/中间 CA 证书 -
proxy_ssl_name值与后端证书 SAN 不一致(如大小写错误、漏掉www.、通配符误用)→certificate verify failed - 后端未返回完整证书链(只发了终端证书)→ 需检查
proxy_ssl_verify_depth是否足够(通常设为 2 或 3)











