在运维过程中,手动更新 SSL 证书不仅繁琐,而且容易因遗忘导致站点无法访问。本文将介绍如何利用 Certbot 的定时任务与 deploy-hook 钩子,实现证书的“无人值守”自动续签及 Nginx 自动重载。

1. 核心逻辑

自动化链条如下:

  1. Systemd Timer:每天自动检查两次证书状态。
  2. Certbot Renew:若证书有效期少于 30 天,自动发起续签。
  3. Deploy Hook:续签成功后,触发 Nginx 热重载,使新证书生效。

2. 配置步骤

第一步:设置全局自动重载钩子

我们需要告诉 Certbot,一旦证书更新成功,就执行 nginx -s reload

编辑 Certbot 的全局配置文件:

nano /etc/letsencrypt/cli.ini

在文件中添加以下行:

# 当证书成功续签后执行的命令
deploy-hook = systemctl reload nginx

第二步:开启自动续签定时器

现代 Linux 发行版在安装 Certbot 后通常自带 Systemd 定时器。我们需要确保它已启动并设置为开机自启。

# 启动并设置开机自启
systemctl enable --now certbot-renew.timer

# 检查定时器状态
systemctl status certbot-renew.timer

如果看到 active (waiting),说明“闹钟”已经设好,系统会定期自动检查。

第三步:清理无效证书

如果服务器上有不再使用的过期域名,建议彻底删除,避免续签脚本报错:

# 列出当前所有证书
certbot certificates

# 删除不再需要的证书
certbot delete --cert-name 你的域名

3. 测试验证

在正式投入运行前,务必执行模拟演练:

certbot renew --dry-run

如果输出显示 Congratulations, all simulated renewals succeeded,说明整个自动化闭环已经打通。

4. 总结

通过 Systemd Timer + cli.ini 的组合,我们实现了 SSL 证书从申请、续签到生效的全流程自动化。这不仅提升了站点的安全性,也极大地释放了运维压力。