通配符证书需用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。插件启用后,续期命令就变成:
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
这样只要失败,你立刻收到邮件,而不是等到用户访问报错才发觉。


















