Skip to content

证书已经更新,为什么访问仍显示旧证书? ​

1. 典型架构:前置 CDN/WAF + 后端 Nginx ​

网站接入 CDN/WAF 后,常见访问路径如下:浏览器与前置服务建立 HTTPS 连接,前置服务再通过另一段 HTTPS 连接后端 Nginx。图中展示了“后端已更新,前置仍用旧证书”的情况。

浏览器看到的是前置 CDN/WAF 的证书 A。只更新后端 Nginx 的证书 B,不会自动替换证书 A。 两层证书分别配置,可以使用不同证书,分别满足对应域名、有效期和信任要求即可。

CDN 和 WAF 都在链路中怎么办?

如果路径是“浏览器 → CDN → WAF → Nginx”,且各层分别接收并解密 HTTPS 连接,则三层各自配置证书,浏览器看到最外层 CDN 的证书。排查时也要检测中间 WAF。

图示适用于前置服务解密 HTTPS、再通过 HTTPS 回源的场景。如果回源使用 HTTP,该段不使用证书;如果前置仅透传 TLS,浏览器看到的是后方实际处理 TLS 的节点证书。原理参见 CDN HTTPS 配置说明。

2. 检测并判断哪一层未更新 ​

先确认实际访问路径,再分别查看公网入口和源站证书。没有前置服务、由 Nginx 直接提供 HTTPS 时,检测公网证书后即可跳到 Nginx 更新检查。

以下命令适用于已安装 OpenSSL 的 Linux/macOS Shell;Windows 用户可使用 WSL,或请运维执行。域名、IP、端口和文件名均需替换为实际值。

检查浏览器实际访问的公网入口 ​

公网可访问的站点可使用 MySSL 检测。命令行也可查看站点证书(替换两处域名):

sh
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null | openssl x509 -noout -serial -dates -fingerprint -sha256

与该层计划部署的新证书文件比较,优先核对 SHA-256 指纹,序列号和有效期用于辅助确认:

sh
openssl x509 -in server.pem -noout -serial -dates -fingerprint -sha256

以上命令用于识别证书,不代替信任和域名校验。未取得证书时,按下方检测失败处理查看原始错误。

指定源站 IP,检查后端 Nginx ​

从 CDN/WAF 的回源配置或运维资产记录中确认源站地址和端口。接入 CDN 后,业务域名的公网 DNS 通常指向前置入口,不能将其解析结果直接当作源站 IP。

下面假设源站 IP 为 192.0.2.20、HTTPS 端口为 443,回源 SNI 为 example.com:

sh
openssl s_client -connect 192.0.2.20:443 -servername example.com </dev/null 2>/dev/null | openssl x509 -noout -serial -dates -fingerprint -sha256

-servername 应与实际回源 SNI 一致;使用独立回源域名时替换为该域名,不要直接用浏览器访问 IP 代替检测。

源站只允许内网或前置服务访问时,由运维在获准访问的网络中执行;连接失败不能说明仍在使用旧证书。

多层链路中,以同样方式检测中间 WAF,使用上一层实际连接它的 IP、端口和 SNI。

进阶排查:命令报错或特殊回源配置

前面的命令为便于比较隐藏了连接日志。如果没有输出证书信息,去掉 2>/dev/null 和后面的 | openssl x509 ...,保留实际检测地址重新执行,例如:

sh
openssl s_client -connect example.com:443 -servername example.com </dev/null

根据输出确认是 DNS 解析失败、连接被拒绝,还是 TLS 握手失败。长时间无响应时可按 Ctrl+C 结束,检查检测网络是否能访问目标 IP 和端口;不要把无结果当成更新成功或失败的证据。

HTTP Host 与 TLS SNI 是不同配置,证书选择发生在 HTTP 请求之前。若实际回源不发送 SNI,使用支持该选项的 OpenSSL,将 -servername example.com 改为 -noservername。

根据结果定位更新位置 ​

以下“新/旧”均相对于该层计划部署的证书判断:

公网入口后端 Nginx判断与处理
旧证书新证书源站已更新,前置入口尚未切换。更新 CDN/WAF 对应域名的证书绑定,并确认配置已发布、生效。
新证书旧证书公网入口已更新,源站仍待处理。HTTPS 回源仍可能因源站证书过期或校验失败而报错。
旧证书旧证书两层均未返回目标证书,分别检查绑定、文件路径和加载结果。
部分新、部分旧任意检查不同区域的 CDN 节点、负载均衡实例、集群节点,以及 IPv4/IPv6、内外网入口。
新证书,但某个浏览器仍显示旧证书新证书核对浏览器最终访问的域名(含跳转)、实际连接 IP、代理和安全软件;关闭该站点连接后重新访问,再比较证书。

3. 在对应层完成更新 ​

前置 CDN / WAF ​

  1. 找到实际接入平台中对应业务域名的 HTTPS 配置;核对域名、监听端口和当前绑定证书。
  2. 将新证书绑定到该域名或监听器,并按平台要求配置匹配的私钥及中间证书链。仅上传到证书库,不代表业务已切换。
  3. 保存并发布配置,确认部署状态;分发时间以实际平台为准,再从公网重新建立连接检测。CDN 和 WAF 分层部署时,分别检查各层。

刷新 CDN 内容缓存通常不能替换 HTTPS 握手证书;应检查证书绑定和配置分发。

后端 Nginx ​

在实际运行的实例或容器中,核对对应 server 配置的 listen、server_name、ssl_certificate 和 ssl_certificate_key,确认引用的是本次更新的文件。证书文件中应包含服务器证书及匹配的中间证书链,顺序参见 Nginx HTTPS 配置说明。

检查配置通过后再重载,例如常规 Nginx 安装可执行:

sh
nginx -t && nginx -s reload

命令应针对实际运行实例;自定义配置、容器或服务管理器按对应运维流程操作。重载后检查日志并重新检测证书,重载失败时旧配置可能继续提供服务。参见 Nginx 配置重载说明。

4. 复测与求助信息 ​

  1. 核对每层证书。 重新执行分层检测,确认公网入口、中间 WAF 和 HTTPS 源站分别返回各自目标证书。
  2. 校验域名和信任链。 可使用 MySSL 检查公网域名;命令行方法见下方折叠区,链问题参见 信任链与客户端兼容。
  3. 确认实际业务与回源成功。 重新打开网站或调用原接口;结合前置服务的回源日志确认 HTTPS 回源成功。CDN 缓存命中的页面访问成功,不能单独证明回源正常。

仍无法定位时,向技术支持提供访问链路、已更新节点、域名、IP/端口、SNI、检测时间、各层证书指纹及错误信息。不发送私钥。

进阶排查:校验域名和信任链

以下命令校验公网入口证书,校验出错时中止握手:

sh
openssl s_client -connect example.com:443 -servername example.com \
  -verify_hostname example.com -verify_return_error </dev/null

确认握手成功、输出 Verify return code: 0 (ok) 且没有证书校验错误;仅有该状态码而没有成功握手,不能作为通过依据。OpenSSL 的信任库可能与浏览器不同,若环境没有正确加载 CA 信任库,可通过 -CAfile /path/to/ca-bundle.pem 指定受信任的 CA 集合,不要把待检查的服务器证书直接当作信任锚。参数说明见 OpenSSL 官方文档。

检测 HTTPS 源站时,将 -connect 改为源站 IP/端口,SNI 与校验域名分别使用真实回源配置中的值;检测机的结果还需结合前置服务实际使用的信任库与回源日志判断。证书链问题参见 信任链与客户端兼容。

进阶排查:只有部分访问仍异常
差异继续检查
不同区域或节点结果不同检查 CDN 配置分发、负载均衡监听器及集群节点。一次检测仅覆盖本次命中的入口。
IPv4/IPv6 或内外网结果不同核对 A、AAAA 和内网 DNS,按分层检测的方法指定各入口 IP;IPv6 地址在 -connect 中使用 [IPv6地址]:端口。
只有某台电脑异常核对最终访问域名、DNS、代理及安全软件,并新建连接检测;不要仅反复清除浏览器缓存。