VPS上的Let’s Encrypt证书没有自动续期,先确认是“没有发起续期”“续期验证失败”,还是“新证书已经签发但Web服务仍加载旧文件”。Certbot通常只会在证书接近到期窗口时执行实际更新,所以手动运行定时任务后显示无需续期,并不等于自动化故障。
先保留证据,不要直接删除证书重申请
在修改配置前记录域名、当前证书到期时间、签发机构、证书文件路径、Web服务类型和最近一次失败时间。删除续期配置或反复申请可能触发签发频率限制,也会丢失真正的失败原因。
sudo certbot certificates
systemctl list-timers --all | grep -i certbot
systemctl status certbot.timer
journalctl -u certbot.service --since "7 days ago"不同发行版和安装方式可能使用systemd timer、cron、Snap或面板自己的调度器;以当前主机实际安装结果为准,不要同时启用多套未知任务。
第一类故障:续期任务根本没有运行
如果日志里没有对应执行记录,检查定时器是否启用、下次运行时间是否存在、系统时间是否正确,以及主机在计划时间是否关机。使用cron时还要检查PATH、工作目录、权限和邮件或日志输出。
修复完成后,先验证调度器能启动Certbot命令,再验证续期流程本身。不要为了看到证书变化而手动缩短系统时间或覆盖生产证书。
第二类故障:HTTP-01验证到不了当前VPS
HTTP-01验证要求域名解析到能响应挑战的服务器,并能从公网访问相应HTTP入口。常见问题包括DNS仍指向旧地址、CDN或负载均衡未把挑战路径转发到当前节点、80端口被安全组或防火墙阻断,以及Web服务器重定向或规则覆盖挑战目录。
- 核对域名的A和AAAA记录,IPv6存在时也要确认其目标可用。
- 从主机外部检查80端口和挑战路径,不能只在本机访问。
- 确认多个Web节点共享挑战文件,或使用适合当前架构的验证方式。
- 检查反向代理、容器端口映射和站点配置是否仍对应续期文件。
第三类故障:DNS-01凭据或插件失效
DNS-01依赖DNS服务商API、插件和权限。令牌过期、权限范围变化、插件升级或DNS传播时间不足,都可能导致验证记录没有正确创建或未被权威DNS看到。
检查日志中的具体DNS错误,确认凭据文件权限、API权限和当前权威DNS。不要把令牌直接写进命令历史、公开日志或文章;测试时使用最小权限,并在完成后复核临时TXT记录是否按预期清理。
第四类故障:证书已续期,网站仍返回旧证书
Certbot成功写入新证书后,Nginx、Apache、HAProxy或容器内服务仍可能持有旧文件。此时应核对Web服务实际引用的证书路径,并查看续期后的部署钩子是否成功执行。
sudo nginx -t
sudo apachectl configtest
sudo systemctl reload nginx只运行与当前服务匹配的检查和重载命令。若证书通过卷挂载进入容器,需确认容器看到的新文件及应用的重载机制;不要在未验证配置时直接重启全部服务。
用模拟续期验证整条链路
Certbot提供模拟续期能力,可验证账户、插件、挑战和部署钩子的主要链路,而不替换生产证书:
sudo certbot renew --dry-run模拟成功后,再检查定时器状态和日志去向。模拟失败时以输出的具体证书名称和验证阶段定位,不要通过关闭防火墙、放开全部端口或删除现有配置来掩盖问题。
恢复后的验收清单
- Certbot能列出目标证书与续期配置。
- 定时器或cron有明确的下次运行时间和可追踪日志。
- 模拟续期成功,挑战路径或DNS权限满足当前架构。
- Web服务配置检查通过,部署钩子能安全重载。
- 从外部访问正式域名,返回的证书序列、域名和到期时间符合预期。
- 为续期失败和剩余有效期设置独立告警,不只依赖浏览器报错。






