如何通过Nginx配置ssl_trusted_certificate解决根证书缺失导致的访问报错问题?

2026-04-27 18:021阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计935个文字,预计阅读时间需要4分钟。

如何通过Nginx配置ssl_trusted_certificate解决根证书缺失导致的访问报错问题?

当Nginx作为反向代理或HTTPS服务端时,若后端服务(如API、gRPC服务或另一个HTTPS站点)使用了自签名证书、私有CA签发的证书,或证书链中缺少根证书/中间证书,客户端(如curl、浏览器或内部服务)可能会报错 SSL certificate problem: unable to get local issuer certificate 或类似错误。此时,不能依赖客户端去安装根证书,而应通过Nginx主动验证并信任指定的根证书——关键配置就是 ssl_trusted_certificate。

理解 ssl_trusted_certificate 的作用场景

这个指令只在 Nginx 启用 SSL/TLS 验证上游服务器(即使用 proxy_ssl_verify on)时生效,它告诉 Nginx:「用这份证书文件里的根和中间证书,来校验上游服务返回的证书链是否可信」。它不用于 Nginx 自己对外提供的证书,也不替代 ssl_certificate

常见适用场景包括:

  • Nginx 反向代理内网 HTTPS 服务(如 K8s Ingress 访问内部 API)
  • Nginx 调用 gRPC over TLS(需启用 grpc_ssl_verify on
  • 对接私有 PKI 环境(如企业 CA、HashiCorp Vault PKI、OpenSSL 自建 CA)

准备可信证书文件(PEM 格式)

ssl_trusted_certificate 必须指向一个 PEM 格式的证书 bundle 文件,里面按顺序包含:

  • 根证书(Root CA)
  • (可选)中间证书(Intermediate CA),如有多个,按签发链从下往上排列(即:中间证书 → 根证书)

⚠️ 注意:不要把上游服务自己的证书放进去;也不要混入私钥或非证书内容。可用以下方式生成:

若你有根 CA 的 root-ca.crt 和中间 CA 的 intermediate.crt

cat intermediate.crt root-ca.crt > /etc/nginx/ssl/trusted-ca-bundle.pem

验证是否有效:

openssl verify -CAfile /etc/nginx/ssl/trusted-ca-bundle.pem upstream-server.crt

在 Nginx 配置中启用验证与信任

locationupstream 块中配置如下关键指令(以反向代理为例):

location /api/ { proxy_pass https://backend-service; <pre class='brush:php;toolbar:false;'># 启用上游证书验证 proxy_ssl_verify on; # 指定可信根+中间证书路径(必须是绝对路径) proxy_ssl_trusted_certificate /etc/nginx/ssl/trusted-ca-bundle.pem; # (推荐)严格校验主机名(防止证书域名不匹配) proxy_ssl_verify_depth 2; proxy_ssl_name "backend.example.com"; # 其他必要设置 proxy_ssl_server_name on; proxy_set_header Host $host;

}

说明:

  • proxy_ssl_verify on 是开关,不开启则 proxy_ssl_trusted_certificate 不生效
  • proxy_ssl_name 应与上游证书的 Subject Alternative Name (SAN) 一致,否则即使证书可信也会因域名不匹配失败
  • proxy_ssl_verify_depth 设为足够覆盖证书链深度(通常 2~3 即可)

排查与验证技巧

配置后 reload Nginx,但访问仍失败?试试这些方法:

  • 检查 Nginx 错误日志:tail -f /var/log/nginx/error.log,搜索 verifycertificate 关键词
  • 确认证书路径权限:Nginx worker 进程(通常是 www-datanginx 用户)需有读取权限
  • openssl s_client 手动模拟上游证书链:

    openssl s_client -connect backend.example.com:443 -showcerts
    观察输出中的证书顺序,并比对是否被你的 trusted-ca-bundle.pem 覆盖

  • 临时关闭验证测试连通性:proxy_ssl_verify off,确认问题确由证书验证引起
标签:NginxSSL

本文共计935个文字,预计阅读时间需要4分钟。

如何通过Nginx配置ssl_trusted_certificate解决根证书缺失导致的访问报错问题?

当Nginx作为反向代理或HTTPS服务端时,若后端服务(如API、gRPC服务或另一个HTTPS站点)使用了自签名证书、私有CA签发的证书,或证书链中缺少根证书/中间证书,客户端(如curl、浏览器或内部服务)可能会报错 SSL certificate problem: unable to get local issuer certificate 或类似错误。此时,不能依赖客户端去安装根证书,而应通过Nginx主动验证并信任指定的根证书——关键配置就是 ssl_trusted_certificate。

理解 ssl_trusted_certificate 的作用场景

这个指令只在 Nginx 启用 SSL/TLS 验证上游服务器(即使用 proxy_ssl_verify on)时生效,它告诉 Nginx:「用这份证书文件里的根和中间证书,来校验上游服务返回的证书链是否可信」。它不用于 Nginx 自己对外提供的证书,也不替代 ssl_certificate

常见适用场景包括:

  • Nginx 反向代理内网 HTTPS 服务(如 K8s Ingress 访问内部 API)
  • Nginx 调用 gRPC over TLS(需启用 grpc_ssl_verify on
  • 对接私有 PKI 环境(如企业 CA、HashiCorp Vault PKI、OpenSSL 自建 CA)

准备可信证书文件(PEM 格式)

ssl_trusted_certificate 必须指向一个 PEM 格式的证书 bundle 文件,里面按顺序包含:

  • 根证书(Root CA)
  • (可选)中间证书(Intermediate CA),如有多个,按签发链从下往上排列(即:中间证书 → 根证书)

⚠️ 注意:不要把上游服务自己的证书放进去;也不要混入私钥或非证书内容。可用以下方式生成:

若你有根 CA 的 root-ca.crt 和中间 CA 的 intermediate.crt

cat intermediate.crt root-ca.crt > /etc/nginx/ssl/trusted-ca-bundle.pem

验证是否有效:

openssl verify -CAfile /etc/nginx/ssl/trusted-ca-bundle.pem upstream-server.crt

在 Nginx 配置中启用验证与信任

locationupstream 块中配置如下关键指令(以反向代理为例):

location /api/ { proxy_pass https://backend-service; <pre class='brush:php;toolbar:false;'># 启用上游证书验证 proxy_ssl_verify on; # 指定可信根+中间证书路径(必须是绝对路径) proxy_ssl_trusted_certificate /etc/nginx/ssl/trusted-ca-bundle.pem; # (推荐)严格校验主机名(防止证书域名不匹配) proxy_ssl_verify_depth 2; proxy_ssl_name "backend.example.com"; # 其他必要设置 proxy_ssl_server_name on; proxy_set_header Host $host;

}

说明:

  • proxy_ssl_verify on 是开关,不开启则 proxy_ssl_trusted_certificate 不生效
  • proxy_ssl_name 应与上游证书的 Subject Alternative Name (SAN) 一致,否则即使证书可信也会因域名不匹配失败
  • proxy_ssl_verify_depth 设为足够覆盖证书链深度(通常 2~3 即可)

排查与验证技巧

配置后 reload Nginx,但访问仍失败?试试这些方法:

  • 检查 Nginx 错误日志:tail -f /var/log/nginx/error.log,搜索 verifycertificate 关键词
  • 确认证书路径权限:Nginx worker 进程(通常是 www-datanginx 用户)需有读取权限
  • openssl s_client 手动模拟上游证书链:

    openssl s_client -connect backend.example.com:443 -showcerts
    观察输出中的证书顺序,并比对是否被你的 trusted-ca-bundle.pem 覆盖

  • 临时关闭验证测试连通性:proxy_ssl_verify off,确认问题确由证书验证引起
标签:NginxSSL