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