必须同时配置proxy_ssl_verify on、proxy_ssl_trusted_certificate、proxy_ssl_name和proxy_ssl_server_name on四项指令,缺一不可;且proxy_ssl_ciphers须严格限定为TLS 1.3原生套件,否则易致502或连接中断。

仅在 proxy_ssl_protocols 中写 TLSv1.3 无法满足合规要求,也不代表实际启用成功。合规性依赖协议、证书验证、SNI 和密钥套件四者协同生效,缺一不可。
必须配齐的四项基础指令
回源链路要通过 TLS 1.3 完成可信握手,以下配置必须同时存在且正确:
-
proxy_ssl_verify on;—— 启用上游证书合法性校验,禁用则失去身份信任基础 -
proxy_ssl_trusted_certificate /path/to/ca-bundle.crt;—— 指向含可信根 CA 及必要中间 CA 的 PEM 文件,路径需可读、权限建议设为 600 -
proxy_ssl_name "backend.example.com";—— 显式声明期望的后端域名,用于匹配证书 SAN 字段;即使proxy_pass写的是 IP 地址也必须设置 -
proxy_ssl_server_name on;—— 启用 TLS SNI 扩展,确保 Nginx 在握手时向后端发送正确的主机名,否则多租户或泛域名场景必然失败
协议与密钥套件必须严格匹配 TLS 1.3 规范
TLS 1.3 已废弃传统协商机制,只接受五种标准化加密套件。混入 TLS 1.2 套件会导致静默降级或连接中断:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 推荐精简配置:
proxy_ssl_ciphers TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256; - 必须移除所有含
_SHA256以外后缀(如_SHA384)、或带ECDHE/RSA密钥交换标识的旧套件 -
proxy_ssl_protocols TLSv1.3;必须与上述 cipher 列表搭配使用,单独设置无意义
动态 SNI 配置适配多租户与云平台回源
当回源目标为共享 IP 的云网关、SaaS 后端或 CDN 源站时,SNI 必须携带用户真实访问域名,而非静态值:
- 在
location块中启用:proxy_ssl_server_name on;并设置proxy_ssl_name $host; - 若 CDN 或前端网关改写了 Host 头,改用
proxy_ssl_name $http_x_forwarded_host;,并补上proxy_set_header X-Forwarded-Host $host; - 避免硬编码域名,否则无法支撑多租户或泛域名业务场景
验证是否真正符合合规要求
配置语法正确不等于运行时达标。需主动验证三项关键事实:
- 用
curl -Iv https://your-domain.com查看响应头和 TLS 版本输出,确认握手使用 TLS 1.3 - 临时提升日志级别:
error_log /var/log/nginx/error.log debug;,搜索SSL_do_handshake() failed或certificate verify failed等线索 - 核对:证书 SAN 是否包含
proxy_ssl_name值;proxy_ssl_trusted_certificate文件权限与路径是否准确;上游服务是否支持 TLS 1.3 + SNI

















