最近在折腾几个自建小工具,每开一个新的二级域名(比如 api.xxx.com、test.xxx.com),都要在宝塔里重新申请一次单域名证书。几个月下来,服务器里挂了一大堆到期时间各不相同的证书,管理起来很琐碎。
索性花点时间把它们统一收拢成 Let's Encrypt 的通配符泛域名证书(*.example.com),顺便打通 DNS API 实现静默自动续期。这里把具体的配置步骤和踩过的两个小坑记录下来,备忘也供参考。
1. 为什么必须使用 DNS 验证方式?
申请单域名证书时,宝塔默认通常走的是「文件验证」(HTTP-01 挑战),Let's Encrypt 的验证服务器直接访问你站点根目录下的临时文件即可。这种方式操作简单,但无法用于申请泛域名证书。
泛域名覆盖了整个主域下所有的二级域名,CA 机构必须确认你对该顶级域名的 DNS 拥有控制权,因此必须走「DNS 验证」(DNS-01 挑战),即在域名解析后台添加一条特定的 TXT 记录。
如果靠纯手工添加 TXT 记录,每到 90 天证书过期前就得人工手动加一次,基本无法实现自动化。要做到完全免维护的自动续期,核心在于让宝塔通过 DNS 服务商提供的 API 接口,全自动添加并删除验证用的 TXT 记录。
2. 准备 DNS 凭据(API 密钥)
在宝塔面板配置前,需要先去你的域名 DNS 解析托管商后台获取 API 访问凭据。出于服务器安全考虑,强烈建议遵循最小权限原则配置:
| DNS 服务商 | 推荐凭据类型 | 安全建议与说明 |
|---|---|---|
| Cloudflare | API Token(自定义令牌) | 权限只需勾选 Zone.DNS:Edit,限制在具体域名,切勿直接暴露全局 Global API Key |
| 阿里云 | RAM 访问控制子账号 | 新建专门子账号,仅赋予 AliyunDNSFullAccess 权限,生成独立的 AccessKey / Secret |
| 腾讯云 / DNSPod | DNSPod Token / 腾讯云 API 密钥 | 推荐使用专用的 DNSPod Token,权限限制在 DNS 解析维度即可 |
拿到对应的 Key 和 Secret 后,回到宝塔面板,在申请界面先输入并保存这些凭据,后续其他站点使用时就无需重复填写了。
3. 申请泛域名证书的实操步骤
准备好 API 凭据后,直接进入站点设置页面开始申请:
- 进入宝塔后台,找到目标站点,点击「设置」->「SSL」-> 选择「Let's Encrypt」。
- 关键填写格式:域名列表里必须同时填入根域名和泛域名,例如:
很多人只填了textyourdomain.com *.yourdomain.com
*.yourdomain.com,这样会导致访问不带 www 的裸域名时直接报证书不匹配错误。
- 验证方式选择「DNS 验证」,服务商下拉选择你托管域名的平台(如 Cloudflare / 阿里云 / 腾讯云),填入对应的 API 凭据。
- 点击「申请」,宝塔会在后台自动调用 API 写入
_acme-challenge的 TXT 解析记录,并等待全球解析生效后完成验证并签发证书。
申请成功后,宝塔会自动将公钥和私钥填入配置并开启 HTTPS。此时该域名下的所有二级子站点,都可以共用这一张泛域名证书。
4. 自动续期确认与排查备忘
Let's Encrypt 泛域名证书的有效期通常为 90 天。宝塔内置了计划任务机制,正常情况下不需要人工干预,但建议在配置完成后做一次检查确认:
- 检查定时任务:进入宝塔「计划任务」,检查是否存在一条名为
续签Let's Encrypt证书的默认任务。该任务默认每天凌晨会扫描服务器上的所有证书,当证书剩余有效期不足 30 天时,会自动调用 acme 脚本发起续期申请。 - DNS 生效延迟报错:如果首次申请或续签时提示
DNS TXT record verify failed,大概率是因为 DNS 解析同步延迟。部分国内服务商的 API 写入虽然成功,但各地区公共 DNS 解析生效需要数十秒,偶尔会导致 Let's Encrypt 抓取超时。如果频繁遇到,可以尝试在宝塔系统设置中将默认的 DNS 服务器地址调整为223.5.5.5或1.1.1.1。 - 多站点共用证书更新:如果你手动将申请好的泛域名证书复制贴到了其他子站点的配置里,续期时主站点证书虽然更新了,但其他静态复制的站点不会自动热重载。对于多站点环境,更规范的做法是在宝塔中开启证书夹,统一从证书夹选择证书进行部署,或者配置 Nginx 配置文件直接引用主站点的
fullchain.pem和privkey.pem路径,这样证书续期后只需重载一次 Nginx 即可全量生效。