Go crypto/x509Go
错误信息
x509: certificate has expired or is not yet valid: current time 2026-08-20T15:47:41+03:00 is after 2026-08-19T12:47:41Z
两个时间戳随每次失败而填入:验证方的时钟时间和证书的有效期边界。“is after”表示已过期;“is before”表示尚未生效。
Go crypto/x509 — CertificateInvalidError (Expired)
含义
验证时间落在证书的 [NotBefore, NotAfter] 区间之外。Go 在消息中给出了比较的双方,因此这是少数自带诊断信息的错误之一:看一看这两个时间戳,判断哪一个有问题——是证书的,还是时钟的。
原因
自动续期出了故障
常见停止运行的 certbot 定时器、失去授权的 ACME 账户,或者在别处续期成功后仍提供旧证书的负载均衡器。公共证书的最长有效期正在缩短,2029年将降至 47 天,手动续期已不再可行。
执行验证的机器时钟不准确
常见刚启动的设备(没有 RTC 的树莓派、从快照恢复的虚拟机、IoT 硬件)上出现“is before”失败,通常说明时钟日期有误(1970年或上个月)——这时所有当前的证书看起来都是尚未生效或已过期。
有效期边界处的时钟偏差
偶见几秒前刚签发的证书(NotBefore = 当前时间),如果由时钟慢一分钟的主机验证,就会因尚未生效而验证失败;短期有效的服务网格证书很容易落入这个时间窗口。
修复方法
- 1.
读取实际提供的证书上的日期
确认端点此刻提供的是哪张证书——续期之后,“已过期”往往意味着“新证书已经存在,但没有对外提供”。如果磁盘上和网络上的日期不一致,就重新加载或重启终止 TLS 的代理。
bash echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \ | openssl x509 -noout -dates # notBefore=... notAfter=... - 2.
修复并监控时间同步
对于“is before”的情况,校正时钟并让它保持准确;证书验证的可靠程度取决于本地时间是否准确。
bash timedatectl status # NTP active? sudo timedatectl set-ntp true - 3.
自动续期,并按剩余有效期告警
在有效期过去 2/3 时续期(certbot 的默认设置),并从主机外部监控到期情况。我们的域名签名健康检查(Signature Health)评估的正是这些——证书链、日期以及缩短有效期的新规则——并免费提供到期提醒。