作为个人站长,使用 Let’s Encrypt 提供的免费 SSL 证书是提升网站安全性的标准做法。Certbot 工具通常能够自动处理续期工作,但当自动续期失败时,往往会让站长措手不及。续期失败最常见的两大原因是:ACME 验证挑战失败(通常是防火墙或Web服务配置问题)和自动执行任务失效。
本文将聚焦这些核心坑点,并提供实用的诊断和解决步骤。
坑点一:ACME HTTP-01 挑战被阻断
Let’s Encrypt 验证服务器需要通过互联网访问你的域名上的特定路径(/ .well-known/acme-challenge/),以证明你拥有该域名。如果这个访问被阻止,续期就会失败。
步骤 1:执行 Dry Run (模拟续期)
首先,使用 dry-run 模式模拟续期过程,这不会真正消耗你的配额,但能复现失败原因。
sudo certbot renew --dry-run
如果输出显示 The client lacks sufficient authorization 或 Timeout during connect, 则基本可以断定是连接问题。
步骤 2:检查防火墙 (Firewall)
Let’s Encrypt 默认使用 HTTP-01 挑战(即端口 80)进行验证。如果你的防火墙(如 UFW 或 iptables)关闭了 80 端口,验证将失败。
UFW 检查与修复示例:
# 检查 UFW 状态,确认 80 端口是否开放
sudo ufw status verbose
# 如果 80 端口未开放,开放它
sudo ufw allow 80/tcp
sudo ufw reload
步骤 3:检查 Web 服务器配置
如果你的 Web 服务器(Nginx 或 Apache)配置了强制 301/302 重定向到 HTTPS (443端口),或者使用了 HSTS,这可能会干扰端口 80 上的 ACME 挑战。Certbot 需要确保 / .well-known/acme-challenge/ 路径是可直接访问的,不会被重定向到 HTTPS。
Nginx 常见配置陷阱修复:
确保在你的 80 端口配置块中,或在全局配置中,ACME 挑战路径不会被重定向。对于使用 Certbot 自动配置的站长,通常不需要手动修改,但如果失败,请检查是否加入了阻止或重定向的规则。
# 确保在 80 端口的 server 块中,该路径可访问
server {
listen 80;
server_name example.com www.example.com;
# Certbot 推荐的配置片段,确保路径不受重定向影响
location ~ /.well-known/acme-challenge {
allow all;
# 停止处理,直接提供文件
break;
}
# 否则,重定向到 HTTPS
location / {
return 301 https://$host$request_uri;
}
}
坑点二:自动执行任务失效
Certbot 的续期是依赖于系统计划任务执行的,通常是通过 Cron Job 或 Systemd Timer。
步骤 4:验证 Systemd Timer (主流发行版如 Ubuntu 18.04+/CentOS 7+)
检查 Certbot 的定时器是否处于活动状态且成功执行。
# 检查 Certbot 定时器状态
systemctl status certbot.timer
# 查看最近的运行记录
sudo journalctl -u certbot.timer
如果定时器未运行,你需要手动启用它:
sudo systemctl enable certbot.timer
sudo systemctl start certbot.timer
步骤 5:验证 Cron Job (较旧系统或自定义安装)
检查 /etc/cron.d/certbot 文件是否存在且内容正确。该文件通常包含如下内容:
# /etc/cron.d/certbot 示例
0 */12 * * * root test -x /usr/bin/certbot -a ! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew
如果 Cron Job 配置有问题,或者 /usr/bin/certbot 路径不正确,任务将静默失败。确保你的系统用户(通常是 root)能够执行该命令。
汤不热吧