SSL证书更新后网站仍提示过期怎么办?证书链、SNI与Nginx重载排查教程

SSL证书已经续期或替换,网站却仍提示过期,问题通常出在Nginx未加载新文件、重载失败、SNI匹配错误、多节点证书不一致,或CDN与负载均衡器仍在返回旧证书。本文提供一套从公网证书指纹开始的排查流程。

SSL证书更新后网站仍提示过期怎么办?证书链、SNI与Nginx重载排查教程

SSL证书已经续期或替换,浏览器却仍提示“证书已过期”,通常说明访问链路中的某个节点还在返回旧证书。常见位置包括Nginx实际加载的文件、未成功重载的进程、SNI匹配错误的虚拟主机、证书未同步的多台服务器,以及仍在终止TLS的CDN或负载均衡器。

不要一开始就反复清浏览器缓存。先确认公网443端口实际返回了哪张证书,再与服务器上的新证书比较,排查会快很多。

适用范围:使用Nginx、Certbot、CDN、负载均衡或多节点部署的HTTPS网站。命令以常见Linux环境为例,请替换示例域名、IP和文件路径。

一、先确认公网返回的是哪张证书

在能够访问网站的Linux或macOS终端执行:

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

重点看有效期、序列号、SHA256指纹、证书域名和签发机构。这里查询的是访客真正收到的证书。云控制台或Certbot显示“续期成功”,只代表新文件已经取得,不等于公网入口已经切换。

同一个站点如果使用根域名和www域名,两个域名都要检查。它们即使解析到同一个IP,也可能匹配到不同的Nginx虚拟主机。

二、比较公网证书与本地新证书

查看准备交给Nginx使用的证书:

sudo openssl x509 -in /etc/letsencrypt/live/example.com/fullchain.pem -noout \
  -subject -issuer -serial -dates -fingerprint -sha256
  • 指纹和序列号一致:公网已经返回这张证书,应继续检查证书链、访问域名、本机时间和浏览器的具体错误。
  • 指纹或序列号不一致:链路仍在使用另一张证书,需要定位由哪个节点返回。
  • 有效期正确但域名不匹配:优先检查SNI、虚拟主机和SAN域名列表。

查看证书包含的域名:

sudo openssl x509 -in /etc/letsencrypt/live/example.com/fullchain.pem \
  -noout -ext subjectAltName

三、确认Nginx实际加载的证书路径

证书可能已经续期,但Nginx仍指向手工复制的旧文件。先导出当前生效配置:

sudo nginx -T 2>/dev/null | grep -nE 'server_name|listen .*443|ssl_certificate'

配置通常应类似:

server {
    listen 443 ssl;
    server_name example.com www.example.com;
    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
}

Certbot环境通常让 ssl_certificate 使用 fullchain.pem,私钥文件必须与证书匹配。不要只搜索某一个配置文件,因为Nginx可能通过 include 加载其他目录。

sudo readlink -f /etc/letsencrypt/live/example.com/fullchain.pem
sudo readlink -f /etc/letsencrypt/live/example.com/privkey.pem

如果Nginx使用 /etc/nginx/ssl/example.com.crt 一类复制文件,而续期工具更新的是 /etc/letsencrypt/live/...,旧文件不会自动改变。可以让配置使用稳定的Certbot链接路径,或在续期完成后通过受控脚本复制并重载。

修改配置前先备份。新证书完成公网验证前不要删除旧文件,以便快速回滚。

四、检测配置并确认重载成功

磁盘上的证书文件被替换后,现有Nginx进程不会自动读取新内容。先检测配置,成功后再平滑重载:

sudo nginx -t
sudo systemctl reload nginx
sudo systemctl status nginx --no-pager
sudo journalctl -u nginx --since '-10 minutes' --no-pager

如果 nginx -t 报错,先修复路径、权限、私钥格式或配置语法。不要直接重启服务试错;配置有问题时,重启可能让原本仍可访问的网站一起中断。

重载后重新查询公网证书。以新的证书指纹为准,不能只凭reload命令没有报错就判断完成。

五、检查SNI与默认虚拟主机

一台服务器可以在同一个443端口托管多个HTTPS域名。客户端通过SNI告诉服务器要访问哪个域名,Nginx再选择对应的 server 块和证书。域名没有正确匹配时,服务器可能返回默认站点的旧证书。

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

再去掉 -servername 做一次对比。如果两次结果不同,说明该IP上存在多个证书;访问域名时仍必须返回对应的新证书。此时检查 server_name 是否遗漏根域名或www域名、443端口是否有冲突配置,以及反向代理回源时的Host和SNI是否正确。

六、逐个检查A、AAAA和负载均衡节点

网站可能同时有IPv4、IPv6、多地域或多台源站。只更新其中一台,会出现“有时正常、有时仍过期”。

dig +short A example.com
dig +short AAAA example.com

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

对每个地址重复查询。每个对外节点都应返回同一批次的新证书。旧IP已经停用时,应从DNS、负载均衡后端和监控配置中一并移除。

七、CDN或负载均衡器是否在返回证书

启用CDN、WAF、反向代理或云负载均衡后,访客看到的证书往往由边缘节点或负载均衡器返回。此时只替换源站证书,公网证书不会改变。

  1. 查询DNS,确认域名是否指向CDN的CNAME或负载均衡地址。
  2. 记录公网入口返回的证书指纹。
  3. 直接连接源站IP,并用 -servername 指定域名,记录源站指纹。
  4. 若两者不同,到CDN、WAF或负载均衡控制台检查前端HTTPS监听器绑定的证书。
  5. 更新后等待平台部署完成,再从不同网络验证。

部分架构存在“用户到CDN”和“CDN到源站”两段TLS。前端证书过期会影响访客,源站证书过期可能导致CDN回源失败,两张证书要分别维护。

八、检查证书链是否完整

有时证书本身没有过期,失败的是中间证书链。Nginx的 ssl_certificate 文件通常需要按顺序包含站点证书和中间证书。

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

如果出现 unable to get local issuer certificate 等错误,检查是否误用了只含站点证书的 cert.pem,或证书链顺序错误。Certbot管理的Nginx站点一般使用 fullchain.pem。不要自行加入根证书,也不要混用其他证书机构的中间证书。

九、Certbot续期后自动重载Nginx

先查看Certbot管理的证书,再模拟续期:

sudo certbot certificates
sudo certbot renew --dry-run

取得新证书后,还需要让服务重新加载。Certbot支持deploy hook:

sudo certbot renew --deploy-hook 'systemctl reload nginx'

生产环境可以使用固定脚本,在 nginx -t 成功后再重载,并在重载失败或公网证书有效期没有变化时告警。命令权限只开放必要范围。

十、公网证书正确后再查客户端

如果公网OpenSSL查询已经返回新证书,再检查:

  • 浏览器提示的是当前域名,还是页面中的子资源、跳转域名或接口域名;
  • 客户端系统时间和时区是否正确;
  • 本地 hosts 是否仍指向旧服务器;
  • 公司代理、安全网关或杀毒软件是否替换了HTTPS证书;
  • DNS缓存是否仍解析到旧IP;
  • CDN证书是否仍在部分边缘节点部署中。

浏览器缓存通常不会让服务器继续返回旧证书。清缓存可以作为最后的客户端排除项,但不能替代公网证书指纹检查。

十一、修复后的验证清单

  • 公网域名返回的新证书序列号、指纹和有效期正确;
  • 根域名、www和其他实际使用的子域名分别通过验证;
  • 每个A、AAAA地址及负载均衡节点返回一致的证书;
  • Nginx配置检测通过,重载日志没有证书读取错误;
  • CDN、WAF或负载均衡器的前端证书已经更新;
  • 服务端返回正确的完整证书链;
  • Certbot模拟续期成功,并具备部署后的重载机制;
  • 到期监控检查公网443端口,而不是只看本地文件。

处理这类故障时,最有用的依据是当前访问入口返回的证书指纹。找出旧证书由哪个节点返回,再修改对应的Nginx、负载均衡或CDN配置,可以避免反复替换文件却没有效果。

参考资料

  1. Nginx官方文档:Configuring HTTPS servers
  2. Nginx官方文档:ngx_http_ssl_module
  3. Certbot官方文档:User Guide
  4. OpenSSL官方文档:s_client
  5. Let’s Encrypt官方文档:证书链与兼容性说明

资料核验日期:2026年9月3日

Web服务与建站知识库

WordPress后台打开慢怎么办?admin-ajax、自动加载选项与插件冲突排查教程

2026-9-2 11:04:59

限时优惠

腾讯云双11轻量应用服务器超低价优惠:最低48元一年

2024-10-27 23:36:36