proxy_ssl_trusted_certificate本身不生效,必须配合proxy_ssl_verify on、proxy_ssl_name、proxy_ssl_server_name三项指令共用,且所指pem文件须仅含根/中间ca证书、顺序正确、格式规范。

proxy_ssl_trusted_certificate 本身不“指定根证书链”就能生效,它只是告诉 Nginx 用哪个文件去查根和中间证书。真正起作用的是:这个文件内容是否合规 + 是否和其他三项指令配合使用。
信任证书文件必须只含 CA,且顺序正确
这个指令指向的 PEM 文件是 Nginx 验证上游证书的“信任锚”,只能包含:
- 根 CA 证书(公钥)
- 中间 CA 证书(公钥)
- 按“自顶向下”顺序拼接:根证书在最前,中间证书依次跟在后面
每张证书必须以 -----BEGIN CERTIFICATE----- 开头、-----END CERTIFICATE----- 结尾,之间不能有空行、空格、私钥、注释或 Windows 回车符(\r\n)。
常见错误包括:
- 直接把后端的
fullchain.pem或server.crt当作信任文件使用 - 混入私钥(
-----BEGIN PRIVATE KEY-----) - 把你自己的
ssl_certificate文件误当信任源
验证文件是否合法:
openssl pkcs7 -print_certs -in /etc/nginx/ssl/trusted_ca.pem -noout
能正常输出证书信息,说明格式和内容基本没问题。
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
推荐路径:
-
/etc/nginx/ssl/trusted_ca.pem(自建私有 CA 场景) -
/etc/ssl/certs/ca-certificates.crt(复用系统级可信 CA 包,适用于公网云服务)
四项指令必须同时启用,缺一不可
仅写 proxy_ssl_trusted_certificate 不会触发任何校验。以下四条必须共存于同一个 location 或 upstream 块中:
proxy_ssl_verify on;
打开上游证书验证总开关(默认是off)proxy_ssl_trusted_certificate /path/to/trusted_ca.pem;
指向你准备好的、只含根/中间 CA 的 PEM 文件proxy_ssl_name "api.example.com";
显式声明期望的后端域名,用于比对证书中的 SAN 字段;若proxy_pass使用 IP、变量(如https://$host)或泛域名,此项不可省略proxy_ssl_server_name on;
启用 TLS SNI,确保 Nginx 握手时向后端发送正确域名,对接云服务、多租户或泛域名后端时必需
生产环境建议补充配置
为提升校验可靠性与安全性,可追加:
proxy_ssl_verify_depth 3;
默认只验证 1 层(终端 → 直接签发者),三方或私有 CA 常含多级中间证书,设为2或3更稳妥proxy_ssl_session_reuse off;
禁用 TLS session 复用,避免缓存异常证书导致校验被绕过proxy_ssl_protocols TLSv1.2 TLSv1.3;
明确禁用 TLSv1.0/1.1,防止协议降级干扰校验逻辑权限设为
644,确保 Nginx worker 进程可读该文件
不复杂但容易忽略










