Nginx校验后端HTTPS证书必须同时配置四个指令:proxy_ssl_verify on; proxy_ssl_trusted_certificate; proxy_ssl_name; proxy_ssl_server_name on;缺一不可,且须置于location或upstream块内。

必须同时配置的四个关键指令
缺一不可,且只能放在 location 或 upstream 块中(写在 http 或 server 块里无效):
-
proxy_ssl_verify on;—— 明确启用上游证书校验(默认是off,不设等于完全不检查) -
proxy_ssl_trusted_certificate /path/to/ca-bundle.crt;—— 指向 PEM 格式的可信根 CA 和中间 CA 证书文件,不能含私钥或后端服务证书 -
proxy_ssl_name "backend.example.com";—— 显式声明期望的后端域名,用于匹配证书中的 Subject Alternative Name(SAN),尤其当proxy_pass使用 IP、变量(如https://$host)时必须设置 -
proxy_ssl_server_name on;—— 启用 TLS SNI 扩展,确保 Nginx 握手时向后端发送正确域名,否则多域名后端可能返回默认或错配证书
提升验证稳定性的补充配置
生产环境建议加上这几项,避免因链深度不足、协议降级或连接复用绕过校验:
-
proxy_ssl_verify_depth 3;—— 默认只验 1 层(终端 → 根),但多数后端用“终端 → 中间 CA → 根 CA”三级链,设为 3 更稳妥 -
proxy_ssl_protocols TLSv1.2 TLSv1.3;—— 禁用 TLSv1.0/v1.1,防止握手被降级干扰验证逻辑 -
proxy_ssl_session_reuse off;—— 关闭 TLS session 复用,避免缓存异常证书状态导致后续请求跳过校验
信任证书文件的准备要点
proxy_ssl_trusted_certificate 所指文件必须满足:
- 格式为纯 PEM:每张证书以
-----BEGIN CERTIFICATE-----开头、-----END CERTIFICATE-----结尾 - 只包含可信根 CA 和中间 CA 证书(可多个拼接),顺序不限
- 严禁混入私钥、后端服务器证书(
server.crt)、fullchain.pem中的终端证书 - 推荐路径:
/etc/nginx/ssl/upstream-ca.crt,权限设为644,确保 nginx worker 进程可读 - 验证方式:
openssl pkcs7 -print_certs -in /path/to/file.crt -noout能正常输出证书信息即为合法
常见失败原因与快速确认点
启用后出现 SSL_do_handshake() failed 或 certificate verify failed,优先检查:
- 证书链是否完整:用
openssl s_client -connect backend:443 -servername backend.example.com观察返回的证书块数量;若只有一段,说明后端没返回中间证书 -
proxy_ssl_name是否与证书 SAN 完全一致(区分大小写,通配符需匹配,IP 地址需显式出现在 SAN 中) -
proxy_ssl_trusted_certificate文件路径是否正确、内容是否合规、Nginx 是否有读取权限 - 后端证书是否已过期、是否被吊销(Nginx 不主动查 OCSP/CRL,但签名无效或过期会直接拒绝)


















