如何用 cron 自动续期 Let's Encrypt 证书?

Let's Encrypt 证书自动续期:certbot renew 原理、官方推荐的每日两次 cron 写法、--deploy-hook 重载 Nginx、续期失败监控与 FAQ。

最佳实践
如何用 cron 自动续期 Let's Encrypt 证书?封面

Let's Encrypt 证书有效期 90 天,官方建议每天跑两次 certbot renew——它只在剩余不足 30 天时才真正续期,其余时间秒退无负担。 多数发行版装 certbot 时已自带 systemd timer/cron 规则,先检查再决定要不要手写。

1. 安装 certbot

# Ubuntu/Debian
sudo apt install certbot python3-certbot-nginx

# RHEL/CentOS(EPEL)
sudo dnf install certbot python3-certbot-nginx

2. 先检查:可能已经有自动续期了

systemctl list-timers | grep certbot      # systemd timer(现代发行版默认)
ls /etc/cron.d/ | grep certbot            # 或者 cron 规则
sudo certbot renew --dry-run              # 演练一次,验证续期流程可用

有 timer 就不要再加 cron,两套并行徒增混乱。

3. 手写 cron 规则(没有自带时)

# /etc/cron.d/certbot:每天 03:17 和 15:17 各检查一次
17 3,15 * * * root certbot renew --quiet --deploy-hook "systemctl reload nginx"

要点:

  • 官方推荐每天两次:续期失败有充足的重试窗口,配合 90 天有效期足够从容。
  • --quiet:无动作时不输出,避免 cron 邮件轰炸。
  • --deploy-hook仅在真正续期成功后执行——重载 Web 服务器加载新证书。别把 reload 写在外面,否则每天白重载两次。
  • 时间错开整点(03:17 而非 03:00),减轻 LE 服务器压力,也避免和其他整点任务挤在一起。

4. webroot / standalone 的特殊情况

  • nginx/apache 插件模式:续期时 certbot 自动改配置验证域名,上面的写法直接可用。
  • webroot 模式certbot renew 复用申请时的 webroot 路径,无需停站。
  • standalone 模式:续期瞬间要独占 80 端口,需 --pre-hook "systemctl stop nginx" --post-hook "systemctl start nginx" 配合。

观测云对照

证书过期是典型的"平时零存在感、出事即全站不可用"故障,而续期失败恰恰发生在无人盯防的凌晨。两道防线:其一,把 certbot 日志(/var/log/letsencrypt/)采集到观测云,续期失败立即告警;其二,用观测云的站点可用性监测直接盯着 HTTPS 端点,证书剩余天数、握手失败都会变成可告警的指标——续期流程和最终效果双保险。

常见问题(FAQ)

Q:证书还有 60 天,手动 renew 会怎样?
A:certbot 会提示"未到续期窗口"并跳过。它默认只在剩余 ≤30 天才真正换发,--force-renewal 可强制(注意 LE 有速率限制,别玩过头)。

Q:续期后浏览器还是旧证书?
A:九成是 Web 服务器没 reload。确认 --deploy-hook 配置,或检查 Nginx 是否以 daemon 方式正常收到了 HUP。

Q:多域名证书会分别续期吗?
A:certbot renew 会遍历 /etc/letsencrypt/renewal/ 下所有证书配置,该续的都续,一次命令全覆盖。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台