排查nginx https代理证书信任问题,关键是让nginx作为https客户端正确验证后端证书:必须在location或upstream块中显式配置proxy_ssl_verify on、proxy_ssl_trusted_certificate(指向可信ca pem文件)、proxy_ssl_server_name on及proxy_ssl_name(与后端证书san严格匹配)。

排查 Nginx HTTPS 代理中的证书信任问题,关键不是反复检查前端证书,而是聚焦 Nginx 作为“HTTPS 客户端”连接后端时的验证链是否打通。常见报错如 SSL certificate problem: unable to get local issuer certificate 或 certificate verify failed,基本都指向这一个环节。
确认 Nginx 是否真正开启并执行了证书验证
默认情况下 proxy_ssl_verify 是 off,即使你写了 proxy_pass https://,Nginx 也不会校验后端证书——它会静默跳过,直到某次配置变动或环境变化才暴露问题。
- 必须显式在
location或upstream块内写:proxy_ssl_verify on; - 仅在
http或server块中声明无效,不会生效 - 搭配
proxy_ssl_trusted_certificate使用,否则会直接失败(Nginx 等不到信任锚)
检查 SNI 是否正确传递到后端
如果后端是多域名共用一套 IP 的 HTTPS 服务(如泛域名证书、MinIO、内部网关),Nginx 不发 SNI,后端就只能返回默认证书,大概率与请求域名不匹配。
- 启用 SNI:加
proxy_ssl_server_name on; - 指定目标域名:用
proxy_ssl_name $http_x_forwarded_host;(CDN 场景)或proxy_ssl_name "api.internal.com";(固定后端) - 注意:
proxy_ssl_name必须与后端证书的 SAN(Subject Alternative Name)完全一致,大小写、通配符(*.example.com)、是否含www都要核对
验证信任证书文件是否有效且路径正确
proxy_ssl_trusted_certificate 指向的文件,不是你的站点证书,而是用于验证后端证书的“根 CA + 中间 CA”证书集合(PEM 格式)。
- 用命令检查内容:
openssl x509 -in /etc/nginx/ssl/internal-ca.crt -text -noout | grep "Subject:",确认有可信 CA 信息 - 文件权限设为
644,确保 Nginx 工作进程(如www-data或nginx)可读 - 不能混入私钥、终端证书或 fullchain.pem;只放 CA 证书,每段以
-----BEGIN CERTIFICATE-----开头 - 若后端用 Let’s Encrypt,可用系统证书包:
/etc/ssl/certs/ca-certificates.crt
绕过验证仅限调试,不可用于生产
临时关闭验证能快速判断是不是信任链问题,但绝不能留在线上:
- 测试时可加:
proxy_ssl_verify off;—— 若此时正常,说明问题出在证书或信任配置 - 生产环境必须保持
on,并配齐proxy_ssl_trusted_certificate和proxy_ssl_name - 禁用验证后仍报错(如超时、502),说明问题不在证书层,可能出在网络、后端服务状态或 TLS 协议兼容性上











