Certbot自动化续期需配置定时任务、选择Webroot或Nginx验证方式、确保ACME挑战可达,并通过--post-hook重载服务;务必dry-run测试、监控日志、避免standalone模式。

Let's Encrypt证书90天到期,手动续期不现实。Certbot自动化续期的核心是配置好定时任务+验证方式,并确保Web服务在续期时能正常响应ACME挑战。
确认Certbot已正确安装并支持自动续期
Certbot 1.0+ 版本默认支持renew子命令,它会自动检查所有已申请证书的过期时间(提前30天触发),只对即将过期的证书执行续期。建议使用系统包管理器安装(如Ubuntu用apt install certbot python3-certbot-nginx),避免pip安装导致路径或权限问题。
- 运行
certbot --version确认版本≥1.0 - 执行
certbot renew --dry-run测试流程是否通畅(不真实更新,但模拟DNS/HTTP验证和证书签发) - 若报错“no names found”,说明证书未被Certbot识别——可能因手动复制证书、未用
certbot certonly申请,或/etc/letsencrypt/renewal/下缺少对应配置文件
选择适合的验证方式并保持长期可用
自动续期成败关键在于ACME验证能否每次成功。推荐优先使用--webroot或--nginx(Nginx用户),避免依赖独立HTTP服务(如standalone模式)带来的端口冲突或服务中断风险。
-
Webroot模式:需确保Web服务器可访问
.well-known/acme-challenge/目录,且该路径未被重写或屏蔽。例如Nginx中需显式放行:location ^~ /.well-known/acme-challenge/ { allow all; } -
Nginx插件模式:Certbot自动修改Nginx配置临时响应挑战,续期后恢复原配置。要求Nginx配置语法正确,且Certbot有重载Nginx权限(通常通过
systemctl reload nginx) - 避免使用
--standalone:它需独占80/443端口,与运行中的Web服务冲突,除非你停掉服务再续期(不满足“无缝”要求)
配置可靠的系统级定时任务
Linux系统推荐使用systemd timer或cron,每天运行一次certbot renew。Certbot自身具备幂等性——仅续期30天内将过期的证书,不会重复操作。
-
cron示例(推荐添加到
/etc/cron.d/certbot):0 12 * * * root /usr/bin/certbot renew --quiet --post-hook "/usr/bin/systemctl reload nginx"
表示每天中午12点执行,成功续期后自动重载Nginx使新证书生效 -
关键参数说明:
--quiet减少日志输出;--post-hook在续期成功后执行(如reload服务);--deploy-hook在每次部署新证书时执行(即使未续期,只要证书变更就触发,适合清理缓存等) - 务必测试定时任务权限:以root身份运行
sudo -u root /usr/bin/certbot renew --dry-run,确认无权限拒绝或路径错误
监控续期结果,及时发现失败
自动不等于无忧。Certbot续期失败时默认只写日志,不报警。必须主动检查日志或配置通知机制。
- 日志位置:
/var/log/letsencrypt/letsencrypt.log,重点关注ERROR或“Renewal failed”字段 - 简单监控脚本示例(加入cron每日检查):
grep -q "RENEWED" /var/log/letsencrypt/letsencrypt.log && echo "OK" || echo "ALERT: Certbot renew failed yesterday" | mail -s "Certbot Alert" admin@example.com - 也可用
systemd监听timer状态:systemctl list-timers certbot.timer查看下次执行时间与上一次结果

















