跳转到主内容
极星编程网:以代码为星,赴技术山海!

实战演示 Nginx 结合 Certbot 手动模式实现通配符域名证书的续期管理

通配符证书需用DNS-01验证手动申请并配合钩子脚本实现半自动续期:首次申请执行certbot certonly --manual --preferred-challenges dns;续期须用--manual-auth-hook和--manual-cleanup-hook调用DNS操作脚本;Nginx需手动配置证书路径并reload;定时任务应每日执行并配置失败告警。 通配符证书( *.example.com )适合管理大量子域名,但 Let’s Encrypt 不支持用
--nginx
插件自动续期通配符证书——因为 DNS 验证无法由 Nginx 自动完成。所以必须用 手动模式(
--manual
)配合 DNS 验证 ,并辅以脚本+定时任务实现“半自动续期”。下面直接上可落地的实战步骤。 一、首次申请通配符证书:明确走 DNS-01 验证 执行命令前确保: 你有权限修改该域名的 DNS 解析(如阿里云、Cloudflare、DNSPod 等) Nginx 已正常运行,且 80/443 端口未被占用(手动模式不依赖 HTTP 服务) Certbot 已安装,且支持
certonly
和
--manual
(CentOS 8+ 推荐用
dnf install certbot python3-certbot-nginx
) 运行申请命令(以
example.com
为例):
sudo certbot certonly \ --manual \ --preferred-challenges dns \ --server https://acme-v02.api.letsencrypt.org/directory \ -d example.com \ -d *.example.com \ --agree-tos \ --email admin@example.com
执行后 Certbot 会暂停,提示你添加一条 DNS TXT 记录: _acme-challenge.example.com → 一串随机值(如
xxxx.yyyy.zzzz
) 注意: 根域和通配符需共用同一 TXT 记录名 (即只加一条
_acme-challenge.example.com
),不是两条。添加后等待 DNS 生效(
dig -t txt _acme-challenge.example.com +short
能查到值即可),回车继续。 二、续期不能靠
certbot renew
直接跑 默认的
certbot renew
命令会尝试复用上次验证方式。但手动模式申请的证书,其配置里没有保存 DNS 凭据或操作逻辑,所以续期时仍会停在 TXT 提示环节——这就不叫“自动”了。 解决办法是:用 带钩子(hooks)的 renew 命令 ,把 DNS 记录的增删封装进 shell 脚本中。例如:
--manual-auth-hook
:执行添加 TXT 记录的脚本
--manual-cleanup-hook
:执行删除 TXT 记录的脚本 如果你用阿里云 DNS,可借助
certbot-dns-aliyun
插件(需提前配置 AK/SK);若用 Cloudflare,可用
certbot-dns-cloudflare
。插件启用后,续期命令就变成: Nginx 在宝塔面板中轻松管理Nginx高性能Web服务器。提供可视化配置反向代理、负载均衡、SSL证书及HTTP缓存功能,一键优化高并发性能,助您高效搭建稳定、快速的网站运行环境。 下载
sudo certbot renew \ --dry-run \ --manual \ --preferred-challenges dns \ --manual-auth-hook "/path/to/auth.sh" \ --manual-cleanup-hook "/path/to/clean.sh"
真实续期去掉
--dry-run
即可。脚本内容取决于你的 DNS 提供商 API,核心逻辑就是:解析出要设的 TXT 值 → 调 API 创建记录 → 等待生效 → 续证成功 → 调 API 删除记录。 三、Nginx 配置不参与续期,但必须指向正确路径 Certbot 手动模式不会改 Nginx 配置。你需要自己确保: 所有子域名的 server block 都引用同一个证书路径,例如:
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
证书更新后,Nginx 不会自动重载——你得在续期命令后加一步:
&& nginx -s reload
或者写进 cleanup hook 末尾。否则新证书已生成,但 Nginx 还在用旧的,浏览器看到的仍是过期警告。 四、定时任务要避开“假成功”陷阱 很多用户设置每月 1 号凌晨续期,结果某次失败了也没报警。建议: 用
systemd timer
或
cron
每天检查一次(Let’s Encrypt 官方也推荐每天运行
renew
) 续期命令加上日志和邮件通知,例如:
0 3 * * * root certbot renew --manual --preferred-challenges dns --manual-auth-hook "/opt/dns-add.sh" --manual-cleanup-hook "/opt/dns-del.sh" >> /var/log/certbot-renew.log 2>&1 && /usr/bin/systemctl reload nginx || echo "Certbot renew failed at $(date)" | mail -s "Certbot Alert" admin@example.com
这样只要失败,你立刻收到邮件,而不是等到用户访问报错才发觉。

相关文章