背景介绍
最近,我发现我的网站 lishaowu.com 出现了“连接不安全”的警告,检查后发现 Let's Encrypt 证书已于 2025年3月18日过期。手动运行 sudo certbot renew 可以成功续订证书,但显然没有自动续订机制,导致证书过期后需要手动干预。作为一个运行在 CentOS 服务器上的网站(使用 Nginx 作为 Web 服务器),我决定配置 certbot 的自动续订功能,确保证书在到期前 30 天自动更新,避免类似问题再次发生。
在这篇博客中,我将分享如何在 CentOS 环境下通过 systemd 定时器配置 certbot 自动续订的完整流程,包括遇到的问题和解决方法。
问题描述
我的服务器上已经安装了 certbot(版本 1.11.0),并通过 certbot 生成了 Let's Encrypt 证书,用于 lishaowu.com 和 www.lishaowu.com。然而,证书过期后,网站显示“连接不安全”,需要手动运行以下命令续订:
sudo certbot renew
续订成功后,我检查了自动续订的配置,发现没有任何定时任务:
- sudo crontab -l 输出 no crontab for root,说明没有通过 cron 配置自动续订。
- sudo systemctl list-timers 只显示了 systemd-tmpfiles-clean.timer,没有 certbot.timer,说明也没有通过 systemd 定时器配置自动续订。
显然,缺少自动续订机制是导致证书过期的主要原因。我决定通过 systemd 定时器配置自动续订,因为 systemd 是现代 Linux 系统中更推荐的方式。
解决流程
以下是配置 certbot 自动续订的完整步骤,主要包括创建 certbot.service 和 certbot.timer 文件,启用定时器,并测试续订功能。
步骤 1:创建 certbot.service 文件
certbot.service 文件定义了一个 systemd 服务单元,用于运行 certbot renew 命令。
-
创建文件: 使用 cat 和 tee 命令创建文件,避免使用 vi 时可能遇到的按键问题(我在阿里云 Workbench 终端中操作 vi 时遇到过按键无反应的情况):
cat << 'EOF' | sudo tee /usr/lib/systemd/system/certbot.service [Unit] Description=Certbot Documentation=file:///usr/share/doc/python-certbot-doc/html/index.html Documentation=https://certbot.eff.org/docs After=network-online.target [Service] Type=oneshot ExecStart=/usr/bin/certbot -q renew PrivateTmp=true EOF
-
验证文件: 检查文件内容是否正确:
cat /usr/lib/systemd/system/certbot.service
预期输出:
步骤 2:创建 certbot.timer 文件
certbot.timer 文件定义了一个 systemd 定时器单元,用于定期触发 certbot.service。
-
创建文件: 同样使用 cat 和 tee 创建文件:
cat << 'EOF' | sudo tee /usr/lib/systemd/system/certbot.timer [Unit] Description=Run certbot twice daily [Timer] OnCalendar=*-*-* 00,12:00:00 RandomizedDelaySec=12h Persistent=true [Install] WantedBy=timers.target EOF
-
验证文件: 检查文件内容:
cat /usr/lib/systemd/system/certbot.timer
预期输出:
步骤 3:启用和启动定时器
-
重新加载 systemd 配置: 确保 systemd 识别新创建的文件:
sudo systemctl daemon-reload
-
启用定时器: 使定时器在系统启动时自动激活:
sudo systemctl daemon-reload
-
启动定时器: 立即启动定时器:
sudo systemctl start certbot.timer
-
验证定时器: 检查定时器是否正常运行:
sudo systemctl list-timers
预期输出(示例):
检查定时器状态:
sudo systemctl status certbot.timer
预期输出(示例):
步骤 4:测试自动续订
运行模拟续订,确认续订功能是否正常:
sudo certbot renew --dry-run
预期输出(示例):
模拟续订成功,说明续订配置正常。