如何通过Nginx配置ssl_trusted_certificate解决根证书缺失导致的访问报错问题?
- 内容介绍
- 文章标签
- 相关推荐
本文共计935个文字,预计阅读时间需要4分钟。
当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 配置中启用验证与信任
在 location 或 upstream 块中配置如下关键指令(以反向代理为例):
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,搜索verify或certificate关键词 - 确认证书路径权限:Nginx worker 进程(通常是
www-data或nginx用户)需有读取权限 - 用
openssl s_client手动模拟上游证书链:openssl s_client -connect backend.example.com:443 -showcerts
观察输出中的证书顺序,并比对是否被你的trusted-ca-bundle.pem覆盖 - 临时关闭验证测试连通性:
proxy_ssl_verify off,确认问题确由证书验证引起
本文共计935个文字,预计阅读时间需要4分钟。
当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 配置中启用验证与信任
在 location 或 upstream 块中配置如下关键指令(以反向代理为例):
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,搜索verify或certificate关键词 - 确认证书路径权限:Nginx worker 进程(通常是
www-data或nginx用户)需有读取权限 - 用
openssl s_client手动模拟上游证书链:openssl s_client -connect backend.example.com:443 -showcerts
观察输出中的证书顺序,并比对是否被你的trusted-ca-bundle.pem覆盖 - 临时关闭验证测试连通性:
proxy_ssl_verify off,确认问题确由证书验证引起

