最近手里几个二级域名的业务站点陆续上线,如果每个子域名都单独申请一张单域名证书,不仅管理起来琐碎,到期维护也很麻烦。趁着周末,我把几个主域名的泛域名证书(通配符证书 *.domain.com)在宝塔面板里统一申请并配置了自动续期。
中间踩了两个关于 DNS API 权限和校验超时的坑,顺手把实操流程和需要注意的细节记下来,留作备忘,也供有同样需求的朋友参考。
1. 为什么泛域名必须配置 DNS 验证
很多人在宝塔申请单域名证书时,习惯直接选“文件验证”,面板会自动在网站根目录下生成验证文件供 CA 机构抓取。这种方式对单个具体域名很方便,但不适用于泛域名证书。
CA 机构(如 Let's Encrypt)规范明确要求:申请泛域名通配符证书,必须通过 DNS TXT 记录来证明你对该根域名拥有完整的控制权。如果选择“DNS 手动验证”,虽然能签发成功,但 90 天到期后无法自动化续签,届时站点依旧会因为证书过期而报安全拦截。因此,想要全自动续期,必须使用 DNS 接口(API)自动增删 TXT 记录。
2. 主流 DNS 接口参数配置参考
在宝塔面板的证书申请页面,选择“DNS 接口”时需要填入域名解析服务商的 API 凭证。不同厂商所需要的认证字段不同,整理如下:
| DNS 服务商 | 申请入口与凭证类型 | 需要填入的关键参数 |
|---|---|---|
| Cloudflare | 用户个人资料 -> API 令牌 | 建议使用 API Token(赋予 Zone:DNS:Edit 权限),尽量不要用全局 Global Key |
| 阿里云(Aliyun) | RAM 访问控制 -> 用户 AccessKey | AccessKey ID 与 AccessKey Secret(建议新建只读写 DNS 权限的子账号) |
| 腾讯云(DNSPod) | DNSPod 控制台 -> 密钥管理 | DNSPod Token(ID 与 Token)或腾讯云 API 密钥(SecretId 与 SecretKey) |
填入凭证后,在域名输入框中建议同时填写根域名和通配符域名,例如:
example.com
*.example.com
这样签发出来的一张证书可以同时保护裸域名和所有的二级子域名,避免访问根域名时出现证书不匹配的警告。
3. 申请失败的几个常见排查点
点击申请后,宝塔会调用底层 acme 脚本向服务商提交 TXT 记录,并等待 CA 验证。如果出现报错,通常集中在以下几个原因:
- API 凭证权限不匹配:特别是 Cloudflare,如果配置了 API Token,必须确保包含对应域名的编辑权限;如果使用了限制客户端 IP 的策略,确保服务器的外网 IP 在白名单内。
- DNS 解析生效延迟:某些域名服务商的海外节点同步较慢,CA 验证服务器抓取不到刚写入的 TXT 记录就会报错。可以稍等两分钟再试一次,或者把域名解析的 TTL 适当调小。
- 服务器无法连接 Let's Encrypt 节点:有些轻量服务器的出网路由不太稳定,在向外网 ACME 验证节点发起请求时超时。可以在终端里手动测试一下服务器到
acme-v02.api.letsencrypt.org的网络连通性。
4. 自动续期的生效机制与验证方法
证书申请成功后,宝塔会自动在面板的“计划任务”中添加一条名为“续签Let's Encrypt证书”的定时任务,默认每天凌晨执行一次检测。
该任务的触发逻辑是:只有当证书剩余有效期不足 30 天时,才会真正触发续期流程,并在续期成功后自动重载 Nginx 或 Apache 进程。平时任务即使每天跑,也不会对服务器资源造成任何压力。
配置完成后,建议在宝塔的“计划任务”列表中找到该任务,手动点击一次“执行”,然后查看执行日志。只要日志显示跳过了未到期的域名且没有报错退出,就说明整套自动续期调用链已经正常打通,后续无需人工干预。