Nginx反向代理信任后端自签名SSL证书的关键是配置proxy_ssl_trusted_certificate指定可信CA根证书,并启用proxy_ssl_verify on;若后端为纯自签名,可将其.crt文件直接用作根证书,同时必须设置proxy_ssl_name匹配证书CN或SAN,否则TLS握手失败。

在 Nginx 作为反向代理时,若后端服务(如 API 服务器、微服务)使用自签名 SSL 证书,Nginx 默认会拒绝建立 HTTPS 连接,并报错:SSL certificate problem: self signed certificate 或 unable to get local issuer certificate。要让 Nginx 信任该后端证书,关键不是“配置 Nginx 自己的证书”,而是**告诉 Nginx 哪个 CA 根证书可用于验证后端的证书链**——即配置 proxy_ssl_trusted_certificate。
准备后端服务的可信根证书
Nginx 不直接信任单个自签名证书,而是信任签发它的根 CA。所以你必须拿到后端服务所用证书的完整信任链起点:
- 如果后端证书是用本地 CA 签发的(推荐做法),把该 CA 的
ca.crt文件复制到 Nginx 服务器(例如/etc/nginx/ssl/backend-ca.crt); - 如果后端是纯自签名(
openssl req -x509一步生成),那就把它自己的server.crt当作根证书用——但仅限测试,且需确保该文件不含私钥、权限为644; - 切勿使用
ca.key或私钥文件,Nginx 只读取公钥性质的 PEM 格式证书(.crt 或 .pem)。
在 proxy_pass 中启用并指定可信证书
在对应 location 或 upstream 块中,添加以下指令:
示例(upstream 方式):
upstream backend_api {
server 10.0.1.20:8443;
# 启用 SSL 验证(默认开启,显式写出更清晰)
keepalive 32;
}
<p>server {
listen 443 ssl;
server_name api.example.local;</p><pre class="brush:php;toolbar:false;">ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
location / {
proxy_pass https://backend_api;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# 关键:告诉 Nginx 用哪个根证书验证后端
proxy_ssl_trusted_certificate /etc/nginx/ssl/backend-ca.crt;
# 必须启用验证(否则上面一行无效)
proxy_ssl_verify on;
# 可选:验证后端证书的域名是否匹配(CN 或 SAN)
proxy_ssl_verify_depth 2;
proxy_ssl_name "api.internal"; # 应与后端证书的 CN 或 SAN 中某项一致
}
}
验证后端证书域名匹配(proxy_ssl_name)
现代 TLS 要求域名校验。如果后端证书的 CN 是 backend.internal,或 SAN 包含 DNS:backend.internal,那么必须设置:
proxy_ssl_name "backend.internal";- 若后端用 IP 访问(如
https://10.0.1.20:8443),证书里必须有对应IP:10.0.1.20的 SAN 条目,且proxy_ssl_name设为该 IP 字符串; - 不设
proxy_ssl_name或设错,会导致SSL_do_handshake() failed类错误。
调试与常见错误处理
启用详细日志可快速定位问题:
- 在
http或server块加:error_log /var/log/nginx/backend_error.log debug;; - 典型报错及含义:
-
peer closed connection in SSL handshake→ 后端未响应 TLS 握手,检查端口、防火墙、后端是否真在 HTTPS 模式运行; -
SSL certificate problem: unable to get local issuer certificate→proxy_ssl_trusted_certificate路径错、文件不存在、格式非 PEM、或内容不是 CA 证书; -
SSL certificate problem: certificate is not yet valid→ 后端系统时间不准,或证书未生效; - 确认后端证书有效性:
openssl s_client -connect 10.0.1.20:8443 -CAfile /etc/nginx/ssl/backend-ca.crt。











