Skip to content

certbot 双版本与自动续期 ​

证书自动续期看起来是个配一次就不用管的事,直到某天发现站点证书过期了——而 certbot 日志里什么都没报。

症状 ​

手动跑 certbot renew 时看到这样的警告:

Attempting to parse the version 5.8.0 renewal configuration file
found at /etc/letsencrypt/renewal/xxx.conf with version 4.0.0 of Certbot.
This might not work.

版本号对不上。原因通常是机器上装了两套 certbot。

先查清楚有几套 ​

bash
which -a certbot
ls -la /usr/bin/certbot /opt/certbot/bin/certbot 2>/dev/null
systemctl cat certbot.service | grep -E "ExecStart"

典型情况:

路径来源版本
/usr/bin/certbotapt install certbot4.0.0(旧)
/opt/certbot/bin/certbotpip 装在 venv 里5.8.0(新)

而 certbot.service 往往被 override 过:

ini
# /etc/systemd/system/certbot.service.d/override.conf
ExecStart=
ExecStart=/opt/certbot/bin/certbot -q renew --no-random-sleep-on-renew

注意那个空的 ExecStart= —— 这是 systemd 里清空父单元配置的写法,不清空的话会累加两条 ExecStart 直接报错。

结论:定时器用的是 /opt/certbot 那份。如果你手动敲 certbot(走 PATH,是 apt 那份),操作的就不是同一套东西。

统一用同一个

手动执行时显式写全路径:

bash
/opt/certbot/bin/certbot certificates
/opt/certbot/bin/certbot renew --dry-run --no-random-sleep-on-renew

renew 看起来"卡住"是正常的 ​

certbot renew 内置随机延迟(最长约 5.5 分钟),目的是防止全世界的客户端在同一秒请求 Let's Encrypt。日志里能看到:

Non-interactive renewal: random delay of 329.1299961692932 seconds

手动测试时加上 --no-random-sleep-on-renew 跳过它。(systemd 的定时器配置里应该也带上这个参数。)

怎么确认续期真的没问题 ​

bash
# 列出所有证书及到期时间
/opt/certbot/bin/certbot certificates

# 模拟续期(不会真的换证书)
/opt/certbot/bin/certbot renew --dry-run --no-random-sleep-on-renew

# 确认定时器在跑
systemctl list-timers certbot.timer

期望看到:

Congratulations, all simulated renewals succeeded:
  /etc/letsencrypt/live/example.cn/fullchain.pem (success)

证书过期前的自检

certbot certificates 里的 VALID: N days 是唯一的可靠指标。N 小于 30 天而续期还没动静,就该去查日志了。

Let's Encrypt 的短效 IP 证书 ​

顺手记一个少见的场景:LE 现在也签给 IP 的证书,但有效期只有 7 天,SAN 里只有 IP Address:x.x.x.x,没有域名。

用途是「还没有域名时也想跑 HTTPS」(比如纯 IP 访问的测试环境)。但要注意:

  • 有效期 7 天,靠自动续期活着
  • 一旦加了域名解析,用域名访问一定报证书错误,因为证书里根本没有这个 DNS 名
  • 这种情况下必须另签一张覆盖域名的证书,IP 证书不能复用

查询方式:

bash
echo | openssl s_client -connect 你的IP:443 -servername 你的域名 2>/dev/null \
  | openssl x509 -noout -subject -dates -ext subjectAltName