证书已续期仍报错:排查实际HTTPS入口
证书续期后,仍有人遇到“已过期”“域名不匹配”或“不受信任”,应先确认访问经过哪个 HTTPS 入口,再检查该入口实际返回的证书。面板里的到期时间只能说明对应文件或配置,不能替代客户端连接检查。
以下 curl 命令先在出现问题的电脑执行;Windows PowerShell 中把 curl 写成 curl.exe。OpenSSL 示例适用于已安装 OpenSSL 3.x 的 Linux 或 macOS 终端。example.com、203.0.113.10 和 2001:db8::10 均为示例,执行前替换成自己的域名和对应 IP。
1. 记下报错域名与实际连接地址
记录完整报错文字、发生时间、访问域名,以及是否只有某台电脑或某个网络失败。先核对故障电脑的日期、时间和时区;客户端时间错误也会影响有效期判断。
curl -V
curl -Iv --connect-timeout 8 --max-time 20 https://example.com/
保存输出中的连接 IP、证书错误和 Location 跳转地址;若显示使用代理,同时记录代理路径。-I 请求响应头,-v 显示连接过程。这条命令不会自动跟随跳转;如果跳到另一个域名,再对新域名单独执行一次。HTTP 405 表示站点不接受 HEAD 请求,不能据此判断证书失败。
example.com 与 www.example.com 要分别检查。HTTPS 连接先验证证书,再处理跳转;起始域名证书有问题时,设置跳转到另一个正常域名无法解决它。
2. 读取该入口实际返回的证书
在 OpenSSL 终端执行下列命令。把 IP 换成要检查的站点 HTTPS 入口,不能填代理服务器的 IP;-servername 后保留发生问题的域名,让服务器按这个域名选择证书。IPv6 目标写成 [2001:db8::10]:443。
openssl version
openssl s_client -connect 203.0.113.10:443 -servername example.com -showcerts </dev/null |
openssl x509 -noout -subject -issuer -dates -ext subjectAltName -fingerprint -sha256
这条管道只用于读取公开证书摘要,校验报错仍会显示。能打印出证书不代表证书有效;严格校验见第 4 步。若长时间无响应,可按 Ctrl+C 结束,记录连接失败,不要把没有输出当成通过。
| 字段 | 怎样判断 |
|---|---|
notBefore / notAfter |
生效和到期时间。按输出标注的时区比较,确认线上是否仍返回旧证书;站点证书在有效期内,也不代表整条证书链都有效。 |
Subject Alternative Name |
核对 SAN 中的域名是否覆盖当前访问名称。不要只看证书的 Subject 或面板里填写的站点名。 |
issuer |
用于对照签发者变化、识别不同入口;单凭签发者名称不能判定可信。 |
SHA256 Fingerprint |
用于核对是否为同一张证书,比较线上返回与准备部署的证书时比“文件名一样”更可靠。 |
要与服务器本地文件比较,在该服务器执行下面的命令,将路径替换为这个站点实际引用的证书文件。它只读取证书,不需要提供私钥:
openssl x509 -in /path/to/fullchain.pem -noout -dates -ext subjectAltName -fingerprint -sha256
同一入口的同类证书可按指纹对照。CDN、不同节点或 RSA/ECDSA 双证书可能使用不同的有效证书;指纹不同本身不是故障,仍须核对对应域名、有效期与信任链。
3. 分别检查 IPv4、IPv6 与其他入口
在允许直连的测试网络执行。--noproxy "*" 让本次 curl 请求不使用其配置的代理;如果网络必须经过代理,应记录代理路径,不能把直连失败当成证书错误。
curl -4 -Iv --noproxy "*" --connect-timeout 8 --max-time 20 https://example.com/
curl -6 -Iv --noproxy "*" --connect-timeout 8 --max-time 20 https://example.com/
一条成功、另一条出现证书错误时,重点比较对应入口的证书。-6 提示无法解析、无法连接或超时,还可能是没有 AAAA 记录或测试网络不支持 IPv6,须与证书校验失败区分。
域名有多个 A 或 AAAA 地址时,按实际解析结果逐个指定 IP 检查。以下两行分别演示 IPv4、IPv6:
curl -Iv --noproxy "*" --resolve "example.com:443:203.0.113.10" --connect-timeout 8 --max-time 20 https://example.com/
curl -Iv --noproxy "*" --resolve "example.com:443:[2001:db8::10]" --connect-timeout 8 --max-time 20 https://example.com/
--resolve 只为这次命令指定连接地址,URL 仍使用原域名,保留 SNI 和域名校验,不修改系统 DNS。直接访问 https://IP/,或只改 HTTP 的 Host 头,不能替代这个检查。解析记录的核对方法见DNS 解析配置与核验。
域名经过 CDN 或负载均衡时,浏览器接触的入口与源站可能不同。只测源站成功,还需测试公开域名入口;只测到一个 CDN 地址,也不能代表所有地区节点。记录失败网络和实际连接 IP,再核对对应节点的部署状态。源站使用内部 CA 时,应按既定回源验证方式验收。
4. 区分缺少中间证书与客户端信任问题
出现 unable to get local issuer certificate 等错误时,对同一个 IP 和域名做严格检查:
openssl s_client -connect 203.0.113.10:443 -servername example.com -verify_hostname example.com -verify_return_error -showcerts </dev/null
-verify_return_error 会在证书验证失败时停止,-verify_hostname 校验目标域名。-showcerts 显示服务端发送的证书列表,这个列表本身不等于验证通过。
确认已收到服务器证书并完成握手,输出包含 Verification: OK 或 Verify return code: 0 (ok),且没有 verify error,才表示本次按指定域名的验证通过。只看到 CONNECTED 不算通过;结论也只适用于本次入口和这台测试机的信任库。
- 如果站点证书由中间 CA 签发,但服务端未发送所需中间证书,按签发机构提供的正确链补齐。不能仅凭“发了几张证书”判断完整性,根证书通常不必随连接发送。
- 某台浏览器能打开,仍不能排除缺链,因为它可能保存过中间证书。对照服务端发送的链与失败客户端的错误,不要只凭另一台电脑正常就结案。
- 同一入口只在某个客户端失败时,比较客户端时间、系统及浏览器更新状态、curl 的 TLS 后端和 CA 路径。curl 与浏览器可能使用不同信任库;公司代理或安全软件也可能改变实际收到的证书,应向管理方核实该签发链。
5. 根据已定位的入口处理并复查
| 检查结果 | 下一步 |
|---|---|
| 本地新证书正确,同一入口仍返回旧证书 | 核对该入口实际引用的文件、站点绑定及服务重载结果。先备份对应配置,再按服务的部署方式修正;完成后重新读取线上证书。 |
| 只有某个 IP、IPv6 地址或域名返回错误证书 | 检查该节点或虚拟主机的证书配置,逐个补齐部署。不要只刷新正常节点后停止排查。 |
| 源站正常,公开域名入口仍报错 | 继续检查 CDN、负载均衡或其他 TLS 入口的证书及部署范围。 |
| 线上证书和链正常,少数客户端仍失败 | 沿客户端时间、信任库和代理路径排查;不要让客户安装来历不明的根证书或跳过安全警告。 |
修复后,从原先失败的网络重新访问,确认相关域名、IPv4/IPv6 与实际入口都通过证书校验,再检查跳转和正常页面。证书部署与续期步骤见网站 HTTPS 配置指南和Certbot 续期验证教程。
仍无法定位时,按日志脱敏指南处理响应头中的 Cookie、Token 等信息,再提交报错时间、域名、连接 IP、错误文字、证书摘要和 curl -V 结果。不要上传私钥;这些信息可用于提交故障工单。
技术依据:curl、OpenSSL、Nginx 官方文档及 TLS 标准。核对日期:2026 年 11 月 4 日。