排错指南

证书过期了怎么办

浏览器拦下访问,提示证书已过期或连接不是私密连接。

证书过期没有「延期」这一说:有效期是签进证书里的,一旦签好就改不了。恢复访问的唯一办法是签发一张新证书,替换服务器上的文件,然后重载服务

整个过程通常十几分钟。但在开始之前,先花一分钟排除两种假过期 —— 每年都有人在这两种情况下白折腾一遍。

先确认是不是真的过期了

用这条命令直接读服务器上正在用的证书的有效期,它绕过了浏览器缓存和本机时钟:

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

# notBefore=Jun  3 08:12:41 2026 GMT
# notAfter=Sep  1 08:12:40 2026 GMT

notAfter 和当前时间比一下。如果它其实还在有效期内,那你遇到的是下面两种情况之一:

情况一:报错的那台机器时钟不对

证书是否过期由客户端拿自己的系统时间判断。一台时间设成明年的手机,会对每一个网站都报证书过期;一台时间落后的机器则会报「证书尚未生效」。如果只有某一台设备报错,先看它的日期。

情况二:证书换了,但服务没重载

证书文件是在启动或重载时读进内存的。续期脚本把文件换掉之后,如果没有重载,线上跑的还是那张过期的证书 —— 磁盘上是新的,内存里是旧的,上面那条命令读到的会是旧的。这种情况直接重载即可,不必重新签发。

nginx -t && nginx -s reload
# 或
systemctl reload nginx

想省掉命令行,跑一次证书检测:它从公网发起一次真实握手,读到的就是访客读到的那张证书,也会直接告出已经过期多少天。

确实过期了:恢复访问的步骤

  1. 签发一张新证书。 本站提供基于 Let's Encrypt 的免费签发,加一条 DNS TXT 记录验证域名所有权即可,不需要在服务器上装任何东西,也不需要开放 80 端口。
  2. 把新的证书和私钥放到服务器上。 建议放在和旧文件相同的路径,这样配置不用改;如果换了路径,记得同时改配置里的两处。
  3. 用 fullchain,不要用只有单张证书的那个文件。 这一步弄错不会报过期,会变成另一个更难发现的故障 —— 见证书链不完整
  4. 重载服务,然后再检测一次确认。

过期期间不要图快把 HTTPS 关掉改回 HTTP。已经开过 HSTS 的站点这么做会让浏览器直接拒绝连接,而不是退回明文,反而更难恢复。

换完还是报过期?按这几处查

  • 没重载。 最常见的一条,前面说过了。
  • 有多个站点配置块。 同一台机器上多个 server 块 / 虚拟主机各自指定证书路径,只改了一处。grep -r ssl_certificate /etc/nginx/ 一次找全。
  • 多台机器或多个容器。 负载均衡后面有几台就有几份证书,滚动更新时容易漏。
  • CDN / SLB 上还挂着旧证书。 源站换了但边缘没换,访客拿到的是边缘那张。云厂商的证书管理控制台是独立的一处,必须单独更新。
  • 浏览器缓存了旧连接。 换一个无痕窗口或用上面的 openssl 命令确认,不要凭刷新判断。

下次别再过期

证书有效期还在继续变短。CA/浏览器论坛已经通过了逐步压缩上限的时间表:2026 年 3 月起最长 200 天,2027 年 3 月起 100 天,2029 年 3 月起 47 天。也就是说,靠日历提醒手工换证这条路会越来越难走,最终必须自动化。

两件事值得现在就做:

  • 让续期自动跑起来。 在本站签发的证书,到期前 30 天会自动创建续期申请并邮件提醒;用 certbot 的话确认 renew 的定时任务在跑,并且 --deploy-hook 里带了重载命令。
  • 加一层独立的到期监控。 这一条容易被跳过,但它防的恰好是自动化本身失效的情况 —— 续期脚本挂了、hook 没重载、CDN 上那份忘了换。从外部定期握手复查,是唯一能发现「我以为已经自动化了」的办法。本站的到期监控免费额度是 5 个地址。

常见问题

检测一下你自己的域名

免登录,一次真实的 TLS 握手,直接给出结论:还有多少天到期、证书链是否完整、是否包含这个域名。

需要一张新证书?本站提供基于 Let's Encrypt 的免费签发,支持泛域名。

了解免费证书

其他排错指南

Last updated on