Nginx代理HTTPS后端证书不信任时,应根据环境选择方案:测试环境可设proxy_ssl_verify off跳过验证;生产环境必须启用proxy_ssl_verify on并配置proxy_ssl_trusted_certificate指向可信CA证书、proxy_ssl_name与后端证书SAN严格匹配、proxy_ssl_server_name on启用SNI。

当 Nginx 使用 proxy_pass 代理到 HTTPS 后端时,如果后端服务器证书不被信任(比如自签名、过期、域名不匹配或由私有 CA 签发),Nginx 默认会拒绝建立上游连接,并报错如:SSL_do_handshake() failed (SSL: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed)。解决的核心思路是:让 Nginx **跳过或正确验证**后端证书。
关闭 SSL 证书验证(仅限测试或内网可信环境)
最直接的方式是禁用上游 SSL 验证,适用于开发、测试或完全可控的内网场景。在 location 或 upstream 块中添加:
-
proxy_ssl_verify off;—— 关闭证书链校验 -
proxy_ssl_trusted_certificate "";—— (可选)清空可信 CA 列表,避免意外干扰 -
proxy_ssl_protocols TLSv1.2 TLSv1.3;—— 显式指定协议,增强兼容性与安全性
⚠️ 注意:此方式不验证服务端身份,存在中间人风险,生产环境严禁使用。
配置可信 CA 证书用于验证后端
若后端使用私有 CA 签发的证书(如企业内部 PKI),需将该 CA 的根证书(PEM 格式)提供给 Nginx,并启用验证:
⚠️ 已弃用 — 该技能已拆分为两个独立技能,以提升模块化程度:**webchat-https-proxy**(HTTPS/WSS 反向代理)和 **webchat-voi...**
- 把 CA 根证书(例如
/etc/nginx/ssl/internal-ca.crt)放在 Nginx 可读路径 - 在 proxy 配置中设置:
proxy_ssl_verify on;proxy_ssl_trusted_certificate /etc/nginx/ssl/internal-ca.crt;proxy_ssl_verify_depth 2;(根据证书链深度调整,默认 1) - 确保后端证书的
Subject Alternative Name (SAN)包含 Nginx 实际访问的域名或 IP(如用proxy_pass https://10.0.1.5:8443,则证书需包含IP:10.0.1.5)
检查后端证书是否符合 TLS 要求
Nginx 对后端证书要求比浏览器更严格。常见问题包括:
- 证书过期或尚未生效(用
openssl x509 -in cert.pem -text -noout检查Not Before/Not After) - 证书链不完整(Nginx 不自动补全中间证书,需在后端服务中配置完整链,或把中间证书合并进后端证书文件)
- 使用了不支持的签名算法(如 SHA-1,旧版 Nginx 可能拒绝;建议用 SHA-256 + RSA/ECC)
- 后端启用了不安全的 TLS 协议或密码套件(Nginx 默认可能拒绝 TLSv1.0 或
NULL/EXPORT套件)
调试技巧与日志定位
开启详细错误日志快速定位问题:
- 在
http或location块中临时加:error_log /var/log/nginx/proxy_ssl_error.log debug; - 重启 Nginx 后触发请求,查看日志中类似
SSL_connect() failed或具体 OpenSSL 错误码 - 用命令行模拟验证:
openssl s_client -connect your-backend:443 -CAfile /path/to/trusted.crt
观察是否提示Verify return code: 0 (ok)










