浏览器访问源站 HTTPS 正常,域名接入 CDN 后却出现证书不受信任、域名不匹配或 502,这时不要只盯着证书有效期。HTTPS CDN 实际包含两次独立的 TLS 握手:客户端与 CDN 边缘节点建立连接,CDN 边缘节点再与 HTTPS 源站建立连接。任意一段的证书链、SNI、协议版本或主机名校验失败,用户看到的现象都可能很相似。
两段 TLS 连接不能混为一谈
| 连接阶段 | 证书由谁提供 | 常见故障 |
|---|---|---|
| 客户端到 CDN | CDN 边缘节点 | 边缘证书未部署、链不完整、域名不在 SAN、旧客户端不兼容 |
| CDN 到源站 | 源站 Nginx 或其他 Web 服务 | 回源 SNI 错误、源站证书不受信、证书过期、协议或密码套件不兼容 |
排查时先确定错误发生在哪一段。用户浏览器直接报证书域名不匹配,通常应检查边缘证书;CDN 返回 502、525、526 或平台定义的 TLS 回源错误,则更可能发生在边缘到源站。状态码含义并非各平台完全一致,需要结合 CDN 错误日志和回源详情确认。
证书链为什么会缺一环
服务器在 TLS 握手中通常发送站点证书和一个或多个中间证书,客户端用本地信任库中的根证书完成验证。根证书一般不需要由服务器发送,但中间证书缺失时,客户端无法稳定建立从站点证书到受信根的路径。部分桌面浏览器可能从历史缓存或网络补齐中间证书,于是看起来访问正常;新的容器、移动设备、Java 程序或 CDN 回源节点未必具备同样条件,问题就暴露出来。
证书文件也有容易混淆的名称。cert.pem 可能只包含站点证书,fullchain.pem 通常包含站点证书与中间证书。实际含义取决于签发工具和部署方式,不能只凭文件名判断。私钥不属于证书链,绝不能把私钥内容粘贴进公开检查工具或工单。
在 Linux 或宝塔服务器上,可从外部检查边缘端点。命令作用是携带 SNI 建立 TLS 连接并输出证书链;风险是输出包含公开证书和网络信息,但不会读取服务器私钥。应在受信终端执行,并替换为自己的域名:
openssl s_client -connect www.example.com:443 -servername www.example.com -showcerts </dev/null
验证时查看返回的证书数量、每张证书的 subject 与 issuer、最终校验结果,以及站点证书的 SAN 是否包含访问域名。该命令只读,无需回滚。若不加 -servername,测试结果可能是服务器的默认证书,不能代表真实浏览器访问。
SNI 决定服务器选择哪张证书
一台 IP 地址上通常承载多个 HTTPS 域名。TLS 握手发生在 HTTP 请求之前,服务器需要在读取 Host 请求头之前选择证书。SNI 由客户端在 ClientHello 中发送目标服务器名称,Nginx 据此匹配虚拟主机并返回对应证书。
这也解释了一个常见误区:把域名解析到某个 IP 后,直接执行 openssl s_client -connect IP:443,看到默认证书便判断部署失败。没有 SNI 时,服务器只能返回默认虚拟主机的证书。正确测试必须保留连接 IP,同时明确发送域名:
openssl s_client -connect 203.0.113.10:443 -servername origin.example.com </dev/null
该命令适用于 Linux、macOS 或安装了 OpenSSL 的环境,作用是验证指定 IP 在收到特定 SNI 时提供的证书。风险较低,但示例保留地址不可直接用于业务测试,应替换为实际源站 IP。验证标准是证书 SAN、有效期和链校验均符合预期。它不改配置,不需要回滚。
回源 Host 与回源 SNI 是两个概念
CDN 使用 HTTPS 回源时,至少涉及连接地址、TLS SNI 和 HTTP Host。连接地址决定连到哪台源站;SNI 决定源站在握手阶段返回哪张证书;Host 在握手完成后用于匹配 HTTP 虚拟主机。三者可以相同,也可能因源站架构不同而需要分别设置。
例如 CDN 连接到源站 IP,但源站证书只覆盖 origin.example.com,那么回源 SNI 应使用证书覆盖的域名。握手后发送的 Host 则应匹配实际站点虚拟主机。如果 CDN 把加速域名作为 SNI,而源站证书只覆盖回源域名,严格校验会失败;如果 SNI 正确但 Host 错误,TLS 可以成功,Nginx 却可能返回默认站点、301 循环或 404。
不要通过关闭源站证书校验长期掩盖问题。关闭校验虽然可能让回源暂时恢复,却削弱了对错误源站或中间人攻击的识别能力。更稳妥的处理是为源站部署有效证书,明确回源 SNI 与 Host,并限制源站访问范围。
在宝塔环境检查证书绑定
宝塔 Nginx 的站点配置通常位于 /www/server/panel/vhost/nginx/,证书目录常见于 /www/server/panel/vhost/cert/。路径会因版本和部署方式变化,应以面板展示及生效配置为准。下面的命令用于只读检查虚拟主机和证书路径:
/www/server/nginx/sbin/nginx -T 2>/dev/null | grep -nE 'listen[[:space:]].*443|server_name|ssl_certificate(_key)?'
环境要求是宝塔安装的 Nginx。作用是确认 443 监听、server_name、证书和私钥路径是否绑定到同一个 server 块。风险是输出会暴露域名与本地文件路径,不能直接发布;命令本身不会显示私钥内容。验证时检查目标域名是否存在、证书路径是否指向预期文件。该操作不修改配置,无需回滚。
还可以检查证书文件中包含多少张证书:
grep -c 'BEGIN CERTIFICATE' /www/server/panel/vhost/cert/example.com/fullchain.pem
openssl x509 -in /www/server/panel/vhost/cert/example.com/fullchain.pem -noout -subject -issuer -dates -ext subjectAltName
命令环境是具备文件读取权限的 Linux 服务器,作用是统计 PEM 证书块并检查第一张证书的主题、签发者、有效期与 SAN。风险在于权限和路径信息泄露,不要对私钥文件执行或输出其内容。证书块数量不能单独证明链正确,还要结合 openssl s_client 的远端结果验证。命令只读,无需回滚。
按症状选择检查路径
浏览器提示名称不匹配
检查浏览器实际访问的域名是否在边缘证书 SAN 中,包括 www 与非 www、业务子域名和通配符边界。*.example.com 通常只覆盖一层子域名,不覆盖 example.com,也不覆盖 a.b.example.com。同时检查 DNS 是否仍有部分记录指向旧 CDN 或旧服务器,尤其是 IPv4 与 IPv6 记录是否一致。
部分设备提示证书不受信任
优先检查边缘或源站是否发送了完整中间证书链,再确认根证书兼容性、交叉签发路径和客户端系统时间。仅在一台浏览器测试通过不能证明部署完整。验证应覆盖无历史缓存的环境、移动网络和实际业务使用的程序运行时。
CDN 回源报 TLS 错误
使用源站 IP 加正确 SNI 进行测试,核对证书有效期、SAN、完整链和 TLS 版本。随后确认 CDN 中配置的回源协议、端口、SNI、Host 与证书校验策略。若源站只允许 CDN 地址访问,应从允许的网络位置测试,避免把防火墙拒绝误判为 TLS 故障。
证书更新后仍返回旧证书
确认更新的是边缘证书还是源站证书,两者不会自动互相替代。检查是否存在多组 CDN 配置、多个源站节点、IPv6 入口或不同 SNI 虚拟主机。Nginx 配置文件更新后若未成功重载,进程仍可能使用旧证书。CDN 边缘部署也可能需要传播时间,应查看平台给出的部署状态,而不是反复上传证书。
变更、验证与安全回滚
替换宝塔 Nginx 证书前,应备份原证书、链文件和对应站点配置,并严格保护私钥权限。不要把线上私钥复制到临时目录后设置宽松权限。证书顺序通常应由站点证书开始,后接中间证书;具体链文件以证书颁发机构提供的内容为准。
完成修改后执行:
/www/server/nginx/sbin/nginx -t
命令适用于宝塔 Nginx,作用是检查配置语法及证书文件能否被读取,不会主动应用变更。风险是错误输出可能包含路径。验证标准是语法正确且测试成功。通过后优先在宝塔面板中重载 Nginx,不建议在业务高峰直接重启。重载完成后,从外部使用带 SNI 的 openssl s_client 再测一次,并检查实际域名的 HTTP 状态与页面内容。
若出现握手失败、站点错配或回源错误,应立即恢复原证书文件和站点配置,重新执行 nginx -t,确认通过后重载。CDN 边缘证书变更也应保留旧配置或平台版本,回滚后验证多个节点。不能只恢复证书而忘记回源 SNI、Host 或 TLS 策略,因为故障可能正是由这些参数组合造成的。
容易留下隐患的处理方式
-
只上传站点证书,不上传中间链,导致部分客户端失败。
-
用不带 SNI 的 IP 测试结果判断域名证书错误。
-
把 HTTP Host 当成 TLS SNI,忽略握手发生在 HTTP 之前。
-
为了恢复业务永久关闭回源证书校验。
-
把私钥、证书压缩包或完整配置发送到公开渠道。
-
证书更新后直接重启服务,没有语法检查和外部验证。
稳定的 HTTPS CDN 接入应同时维护两张清单:边缘域名与边缘证书的覆盖关系,源站地址与回源 SNI、Host、证书覆盖范围的对应关系。每次续期后自动检查有效期、SAN 和完整链,并对客户端到边缘、边缘到源站分别监控。只要把两次握手拆开观察,证书链和 SNI 问题就不再是一团模糊的证书错误,而是一组能够定位、验证和回滚的配置关系。
延伸阅读
