nginx 代理后端 https 证书校验需同时配置四项指令:proxy_ssl_verify on、proxy_ssl_trusted_certificate 指向可信ca文件、proxy_ssl_name 与后端证书san完全匹配、proxy_ssl_server_name on,且必须置于location或upstream块内。

要在 Nginx 中正确校验代理后端的 HTTPS 证书,关键不是让浏览器信任,而是让 Nginx 自己作为客户端,能验证后端返回的证书是否可信。这需要四条指令协同生效,缺一不可,且必须放在 location 或 upstream 块内。
必须配齐的四项核心指令
这四项必须写在同一作用域(不能只写在 http 或 server 块里):
-
proxy_ssl_verify on; —— 显式开启校验,默认是
off,不写等于不验证 - proxy_ssl_trusted_certificate /etc/nginx/ssl/upstream-ca.crt; —— 指向仅含根 CA 和中间 CA 的 PEM 文件(不能含私钥、不能含后端证书)
- proxy_ssl_name "api.internal.com"; —— 必须与后端证书的 SAN 字段完全一致(大小写、通配符、www 前缀都要匹配)
-
proxy_ssl_server_name on; —— 启用 TLS SNI,确保 Nginx 握手时把
proxy_ssl_name发给后端
准备和验证信任证书文件
proxy_ssl_trusted_certificate 所指文件是 Nginx 自己用的信任锚,不是给浏览器看的:
- 内容只能是 PEM 格式的根 CA 和中间 CA 证书(每段以
-----BEGIN CERTIFICATE-----开头) - 若后端用 Let’s Encrypt,可用系统证书包:
/etc/ssl/certs/ca-certificates.crt - 若后端是自签或企业私有 CA,需把该私有根证书内容追加进此文件
- 权限设为
644,确保 Nginx 工作进程可读 - 验证命令:
openssl x509 -in /path/to/upstream-ca.crt -text -noout | grep "Subject:",应能输出可信 CA 信息
处理证书链深度和协议兼容性
商用或内网证书常为三级链(终端 → 中间 → 根),默认深度 1 不够用:
- proxy_ssl_verify_depth 3; —— 显式设为 3,支持完整链校验
- proxy_ssl_protocols TLSv1.2 TLSv1.3; —— 禁用老旧协议,避免握手降级干扰验证
- proxy_ssl_session_reuse off; —— 关闭会话复用,防止缓存异常证书状态
快速验证与调试方法
不重启 Nginx 就能确认配置是否生效:
- 模拟 Nginx 连接后端:
openssl s_client -connect backend-ip:443 -servername api.internal.com -showcerts,观察是否返回完整证书链及 SAN 是否匹配 - 临时加日志:
error_log /var/log/nginx/error.log debug;,查看是否有SSL certificate verify ok或具体失败原因(如unable to get local issuer certificate) - 若关闭
proxy_ssl_verify后请求正常,说明问题确实在证书校验环节











