证书自动续期配置与到期监控
发布时间:2026-02-05 08:44       
更新时间:2026-02-05 11:53
证书装完不代表一劳永逸。Let's Encrypt 的证书只有 90 天有效期,靠人记日期一定会翻车,续期必须交给定时任务,另外再配一道独立的到期监控兜底。
确认续期定时器
certbot 签发的证书,Ubuntu 安装时自带 systemd 定时器,确认方法:
systemctl list-timers | grep certbot
现有证书清单和到期时间用 certbot certificates 一条命令看全,几本证书、挂哪些域名、还剩多少天一目了然,续期季来临前先看这里。CentOS 部分版本只有 cron,手动补一条:
echo "0 3 * * * root /usr/bin/certbot renew --quiet" > /etc/cron.d/certbot-renew
acme.sh 用户不需要额外配置,安装脚本已写入 cron,crontab -l 能看到即可。
先做一次演练
定时器存在不等于真能续成功,先跑一次演练:
certbot renew --dry-run
输出带 success 字样才算数。演练走的是测试环境,不消耗正式配额,可以放心反复跑,每次调整过 Web 服务之后都把它当必做步骤。失败的高频原因有两个:webroot 路径和当初签发时不一致,或者域名已改走 CDN 导致 80 端口验证不通过,按日志提示逐项处理。
续期后自动重载
续期只是换了证书文件,Nginx 不会自己重新加载,需要配一个 deploy hook:
mkdir -p /etc/letsencrypt/renewal-hooks/deploy
cat > /etc/letsencrypt/renewal-hooks/deploy/reload.sh <<'EOF'
#!/bin/bash
logger "certbot renew: reloading nginx"
nginx -t && systemctl reload nginx
EOF
chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload.sh
每次续期成功这个脚本会被自动调用,语法检查通过才重载,不会把错误配置带上线。脚本里的 logger 一行会往系统日志留痕,事后能用 grep certbot /var/log/messages 确认 hook 是否真的跑过。
到期监控兜底
定时器和 hook 都可能静默失效,比如机器时间错乱、cron 服务挂了。所以用一条命令直接读线上证书的真实到期时间:
echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -enddate
把这条命令放进拨测脚本,每天跑一次,剩余有效期低于 14 天就提醒——这个阈值正好覆盖两轮续期周期,一轮失败还有补救时间。提醒走什么渠道都行,关键是值班的人能看见,而不是等出事之后翻日志才发现。多域名站点把域名列表放进循环逐个检查。续期和监控是两条独立的线,各管各的,别只押一边,两条都常年在线,证书这件事才算真正省心。