排查CDN回源HTTPS证书信任链中断,核心是Nginx作为客户端验证源站证书:需显式启用proxy_ssl_verify on、严格匹配proxy_ssl_name与源站SAN、配置正确proxy_ssl_trusted_certificate文件、并确保源站返回完整且顺序正确的证书链。

排查 CDN 回源 HTTPS 时的证书信任链中断故障,核心是明确 Nginx 在此场景中扮演“HTTPS 客户端”角色——它要验证 CDN 回源请求所访问的源站(即你自己的后端服务)证书是否可信。错误表现通常是 CDN 返回 502、503 或 “SSL handshake failed”,而非浏览器端报错。
确认 Nginx 是否启用并严格校验回源证书
CDN 回源本质是 Nginx 接收 CDN 的 HTTP/HTTPS 请求,再以 HTTPS 主动向你配置的 upstream(如 origin.example.com)发起代理请求。默认情况下 proxy_ssl_verify 是 off,Nginx 会跳过证书校验,看似正常,但一旦 CDN 启用强校验或环境变更,就会暴露问题。
- 必须在 location 或 upstream 块中显式开启:proxy_ssl_verify on;
- 仅写在 http/server 块中无效,reload 不报错但不生效
- 开启后若未配 proxy_ssl_trusted_certificate,Nginx 直接拒绝建立连接,日志报 unable to get local issuer certificate
检查回源域名与证书 SAN 是否完全匹配
CDN 回源时,Nginx 用 proxy_pass https://origin.example.com 这类域名地址发起请求,此时必须确保:
- proxy_ssl_name "origin.example.com"; —— 值必须与源站证书的 Subject Alternative Name (SAN) 字段逐字一致(含大小写、www.前缀、通配符格式)
- proxy_ssl_server_name on; —— 启用 TLS SNI,让 Nginx 在握手时把该域名发给源站;否则源站可能返回默认证书(如泛域名或测试证书),导致 SAN 不匹配
- 若使用变量回源(如 proxy_pass https://$origin_host;),proxy_ssl_name 更不可省略,且建议设为 $origin_host
验证 Nginx 本地信任库是否覆盖源站 CA
proxy_ssl_trusted_certificate 指向的文件,是 Nginx 自己用来验证源站证书的“信任锚”,不是给浏览器看的。常见错误是误用 fullchain.pem 或混入私钥。
- 文件必须是 PEM 格式,仅含根证书 + 中间证书(如 Let’s Encrypt 的 ISRG Root X1 和 R3;或企业内网 CA 的根证书)
- 不能含源站证书、不能含私钥、不能含空行或非证书内容
- 推荐路径:/etc/nginx/ssl/cdn-upstream-ca.crt,权限设为 644
- 快速验证:运行 openssl x509 -in /etc/nginx/ssl/cdn-upstream-ca.crt -text -noout | grep "Subject:",应清晰显示可信 CA 名称
确认源站是否返回完整且顺序正确的证书链
即使 Nginx 配置全对,若源站(你的 origin 服务)只返回终端证书,不带中间证书,Nginx 校验仍会失败(尤其在高安全要求 CDN 场景下)。
- 用 Nginx 视角模拟回源:运行 openssl s_client -connect origin.example.com:443 -servername origin.example.com -showcerts
- 观察输出中 BEGIN CERTIFICATE 块数量和顺序:第一块必须是 origin.example.com 的证书;第二块起应为中间证书(Issuer 与上一块 Subject 匹配);不能含根证书
- 若只有一块,说明源站 Nginx 的 ssl_certificate 指向的是 cert.pem 而非 fullchain.pem,需修正并重载


















