外观
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/certbot | apt install certbot | 4.0.0(旧) |
/opt/certbot/bin/certbot | pip 装在 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-renewrenew 看起来"卡住"是正常的
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