证书过期了怎么办
浏览器拦下访问,提示证书已过期或连接不是私密连接。
证书过期没有「延期」这一说:有效期是签进证书里的,一旦签好就改不了。恢复访问的唯一办法是签发一张新证书,替换服务器上的文件,然后重载服务。
整个过程通常十几分钟。但在开始之前,先花一分钟排除两种假过期 —— 每年都有人在这两种情况下白折腾一遍。
先确认是不是真的过期了
用这条命令直接读服务器上正在用的证书的有效期,它绕过了浏览器缓存和本机时钟:
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想省掉命令行,跑一次证书检测:它从公网发起一次真实握手,读到的就是访客读到的那张证书,也会直接告出已经过期多少天。
确实过期了:恢复访问的步骤
- 签发一张新证书。 本站提供基于 Let's Encrypt 的免费签发,加一条 DNS TXT 记录验证域名所有权即可,不需要在服务器上装任何东西,也不需要开放 80 端口。
- 把新的证书和私钥放到服务器上。 建议放在和旧文件相同的路径,这样配置不用改;如果换了路径,记得同时改配置里的两处。
- 用 fullchain,不要用只有单张证书的那个文件。 这一步弄错不会报过期,会变成另一个更难发现的故障 —— 见证书链不完整。
- 重载服务,然后再检测一次确认。
过期期间不要图快把 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 的免费签发,支持泛域名。
了解免费证书其他排错指南
- 证书快到期了:先分清是没续期,还是续了没部署证书还没过期,但剩余天数已经不多了。
- 证书还没到生效时间:多半是时钟不对证书的生效时间还没到,被判定为无效。
- 证书透明度日志里出现了没见过的证书监控期间,域名下出现了不是本站签发的新证书。
- 无法连接:证书检测连不上服务器时的排查顺序检测连不上服务器,没能拿到证书。
- 「您的连接不是私密连接」:先找错误代码,再决定修哪里浏览器弹出红色警告拦下访问,但不知道属于哪一种证书问题。
- 关闭 TLS 1.0 / 1.1,只留 1.2 和 1.3服务器还在使用 TLS 1.0 或 1.1 协商连接。
- 证书不包含这个域名:ERR_CERT_COMMON_NAME_INVALID 的几种成因浏览器提示证书不适用于该网站,或者拿到了另一个站点的证书。
- 电脑打得开、手机 App 报证书错误:证书链缺少中间证书电脑浏览器打得开,手机 App、curl 或 Java 客户端却报证书错误。
- OCSP stapling:开了能快一点,不开也不算故障没有启用 OCSP stapling,首次握手会稍慢一些。
- 证书被吊销,或者链验证没通过证书被吊销,或者链验证没有通过。
- 自签名证书:什么时候没问题,什么时候必须换证书是自己签给自己的,浏览器不信任。
- 证书链追溯不到受信任的根:新根交叉签名与私有 CA浏览器打得开,curl、旧安卓或 Java 客户端却说找不到颁发者证书。
- RSA 密钥长度不足:为什么现在才被提醒证书的 RSA 密钥长度低于 2048 位。
- 泛域名证书为什么不覆盖主域名子域名都正常,直接访问主域名却报证书错误。
Last updated on