部署好 HTTPS 之后,很多人以为配置了 Certbot 就能”一劳永逸”,结果几个月后浏览器突然弹出证书过期警告,才发现自动续期悄悄失败了。Certbot(Let’s Encrypt 官方推荐证书客户端)内置了 renew 定时续期机制,但它的默认续期频率、端口占用、目录权限、DNS(Domain Name System,域名系统)解析任何一个环节出问题,都会让证书停在 90 天有效期边缘。本篇文章将教你如何从零理清 Certbot 自动续期的完整链路、如何定位续期失败的三类最常见根因,并如何用一张排查表在 10 分钟内解决自己的证书问题,让服务器 SSL 证书在 90 天内稳定自动续期,避免因过期导致的访问中断和信任损失。SSL(Secure Sockets Layer,安全套接层,用于加密客户端与服务器之间的通信)证书的自动续期,正是保障 HTTPS 长期稳定的关键。

Certbot 自动续期是怎么运行的
Let’s Encrypt 签发的证书默认有效期为 90 天,这是它的安全设计——缩短有效期以降低私钥泄露带来的损失。因此服务器必须周期性申请新证书,这一过程称为续期(renew)。Certbot 默认已经安装了续期定时机制,系统会自动尝试在到期前大约 30 天内续期证书,而不是等到最后一天。
Certbot 判断”是否需要续期”的依据是证书剩余天数。当剩余天数小于续期阈值时,它才会真正执行 renew;如果还远没到时间,renew 命令会直接返回”没有需要续期的证书”,这是一种正常状态,不代表定时任务坏了。
用下面的命令查看当前所有证书及其到期时间:
# 列出服务器上所有由 Certbot 管理的证书 sudo certbot certificates
输出里会显示每个域名的证书路径、失效日期(Expiry Date),以及使用的续期配置。示例输出中,如果你的证书 Expiry Date 显示为 2026-11 前后,说明 8 月到期后已经正常自动续期过一次。
续期入口:systemd timer 与 cron
Certbot 续期由系统定时任务驱动。不同安装方式入口不同,先确认自己的续期入口是否存活,这是排障的第一步:
# systemd 方式:查看 certbot 定时器最近一次运行时间 systemctl list-timers | grep -i certbot # cron 方式:查看 crontab 中是否包含 certbot renew crontab -l | grep -i certbot
如果使用 snap 或系统包管理器安装,通常走 systemd timer;如果手动用 crontab 配置,续期入口是 cron 定时任务。判断标准很简单:renew 命令本身能不能正确执行,比定时任务有没有存在更重要。
续期失败的典型原因与前置检查
续期本质上是 Certbot 向 Let’s Encrypt 重新发起一次 ACME(自动证书管理协议,Automated Certificate Management Environment)验证请求。因此凡是在”签发证书时能通过的验证”,在自动续期时也可能因为环境变化而失败。下面是最常见的四类原因:
- 续期入口没有在跑(timer 被停用、cron 被移除)
- 验证端口被占用或防火墙拦截(Nginx 把 80/443 占走但方式不匹配)
- DNS 解析变更,域名无法指向当前服务器
- 部署的 web 服务在验证瞬间不可用
在动手修复前,先手动执行一次试运行(dry-run),这不会真正续期,只模拟验证流程,是安全的:
# 干试:模拟 renew 流程,不写入证书 sudo certbot renew --dry-run
如果干试通过,通常意味着环境没问题,问题出在定时任务没有按预期运行;如果干试失败,就要按下面的验证方式逐项排查。
用 Nginx 验证与 DNS 前提
证书续期的 HTTP 验证依赖网站能对外响应验证请求。如果站点本身在 Nginx 上运行,先确认 Nginx 已启动且对外监听 80 端口。如果服务停着,即便证书命令正确,Let’s Encrypt 服务器也访问不到你的验证文件。
同时要确认域名解析(DNS,Domain Name System,域名系统,负责把域名转换成服务器 IP 地址)仍指向本服务器公网 IP。域名搬家、托管服务变更后最容易漏掉这一步。可以用系统自带工具查一下:
# 查询域名解析,对比是否指向当前服务器公网 IP dig +short your-domain.com A # 如果返回的不是本机 IP,先处理 DNS
如果网站本身在跑 Nginx,续期验证也要依赖 Nginx 转发,可以参考 Nginx 反向代理与限流配置相关的排查经验,避免验证请求被拦截。例如配置限流时的 IP 白名单思路,同样适用于放行 ACME 验证路径,详见 Nginx 请求限流配置。日常内容型内链也可以参考 Nginx 缓存清理与回源机制,理解静态资源在续期验证时是否会被旧缓存干扰。
三种验证方式的选择与续期适配

Certbot 支持的验证方式直接决定续期能不能自动化。最常见的有 Webroot、Standalone 和 Nginx 三种,每一种对端口和 web 服务的要求都不同:
- Webroot:利用已有的站点根目录放置验证文件,无需占用额外端口,适合已有 Nginx/Apache 在监听 80 的场景
- Standalone:验证时由 Certbot 独立监听 80/443 端口,此时必须停止占用的 web 服务,否则端口冲突
- Nginx:通过 Nginx 插件自动完成配置和验证,适合由 Certbot 统一管理 Nginx 配置的场景
用 Webroot 方式续期
如果你的站点是 Nginx 承载,且已经绑定了域名,最稳妥的方式是用 Webroot。首次签发示例:
# 使用 Webroot 方式申请证书 sudo certbot certonly --webroot \ -w /var/www/your-site \ -d your-domain.com
上面的 -w 指定 web 根目录,-d 指定域名,Cerbot 会在 /var/www/your-site/.well-known/acme-challenge/ 下写入验证文件。自动续期时只要这个目录可写、网站能访问,就会顺利完成。
用 Standalone 方式与端口释放
如果域名解析已经就绪,但不想占用 Webroot,可以改用 Standalone。自动续期时务必在定时脚本中先停 web 服务再执行:
# 停止 Nginx 再执行干试(示例,按实际服务调整) sudo systemctl stop nginx sudo certbot renew --dry-run sudo systemctl start nginx
如果你的站点依赖 Redis 缓存、Nginx 配置等联动服务,建议先了解 Redis 持久化与恢复,避免在改验证方式时误伤缓存数据。同时,在做服务器迁移或配置备份前,可以参考 Restic 增量备份实践 先保住证书与私钥副本。
续期失败快速排查表

为了把常见报错和修复对齐,下面整理一张可直接对照的排查表。示例中的 IP 与域名均为示例数据,请替换为你自己的真实值:
| 报错片段 | 典型原因 | 修复方向 |
|---|---|---|
| “Failed to connect to … port 80” | 防火墙或 Nginx 未监听 80 | 开放 80/443 端口,确认 Nginx 启动 |
| “403 Forbidden” | Webroot 目录无写权限或禁止访问 | 检查 .well-known 目录权限与 Nginx 位置块 |
| “DNS problem: NXDOMAIN” | 域名解析失败或不存在 | 检查 DNS,等待生效或修正解析记录 |
| “invalid response” | 验证文件未按预期返回 | 确认 -w 与 -d 对应,或改用 Standalone |
| “Too many requests” | 短时间反复申请次数过多 | 等待并优先用 --dry-run 测试 |
| “Port 80 already in use” | Standalone 与 Nginx 冲突 | 续期前先停止占用的 web 服务 |
让自动续期稳定落地的几条建议
手动验证通过后,要确保自动续期长期可靠,有几点建议:
- 用
certbot renew --deploy-hook在续期成功后自动重载 Nginx,证书更新后不重载服务会继续用旧证书 - 每次证书续期后确认
ssl_certificate与ssl_certificate_key的路径仍指向/etc/letsencrypt/live/下的符号链接 - 把
certbot renew与验证监控分开,避免防火墙规则把验证请求一并拦截
下面给出一个给定时任务加上 deploy-hook 的示例配置(Nginx 重载命令以实际环境为准):
# 在续期成功后自动重载 Nginx,示例配置 sudo certbot renew --deploy-hook "systemctl reload nginx"
证书到期前 30 天与提前预警
除了依赖 Certbot 内置逻辑,也可以自己加一道防线。比如用脚本监控证书剩余天数,低于 30 天时输出告警,避免因定时器暂停而长时间无感知。到期前服务器如遇重启、配置改动,也可以在续期前复查端口与 DNS,把排查成本降到最低。
总结
Certbot 自动续期失败通常不是证书本身的问题,而是验证链路、端口、DNS 或定时任务等前置条件被破坏。建议按以下顺序检查:先用 certbot certificates 看当前余期,再用 certbot renew --dry-run 安全验证流程,确认解析与监听端口正常,最后检查 Nginx 配置与定时任务是否存活。只要这三个环节通畅,你的服务器 SSL 证书就能在 90 天内自动续期,避免因证书过期导致的信任中断。如果你需要一台稳定承载多域名 HTTPS 与高并发的海外服务器,Hostease 提供的 VPS(Virtual Private Server,虚拟专用服务器)与独立服务器方案可以满足部署需求,但证书续期环节仍建议按本文清单定期巡检,确保站点长期可用。
如你用的是 Nginx 反代架构,也可结合 Nginx 限流配置 与 缓存清理 一起做周期巡检,确保验证请求不被异常策略干扰。