泛域名证书在宝塔必须用DNS API验证,因ACME协议强制要求;HTTP/文件验证必然失败,且需正确填写*.example.com,example.com、配置足权API密钥并手动启用DNS模式。

泛域名证书在宝塔里必须走 DNS API 验证,HTTP 或文件验证必然失败。这不是配置问题,是 Let’s Encrypt 的 ACME 协议强制要求——*.example.com 无法通过 HTTP 访问校验,因为通配符不指向具体服务器,只能靠 DNS TXT 记录证明你控制该域名。
为什么“申请”按钮点了没反应或报错 NS error?
常见现象:点「申请」后卡住、日志出现 Cannot issue for "*.xxx": Domain is not valid for issuance 或 No TXT record found。根本原因是面板还在用默认的「文件验证」模式,而泛域名根本不支持这条路。
- 宝塔默认的「Let’s Encrypt」申请入口只暴露 HTTP 验证选项,必须手动切换到 DNS API 模式
- 「设置」→「使用 DNS API 验证」这个开关藏得深,不点开就永远走不通
- 即使填了阿里云/Cloudflare 密钥,如果没在「SSL」页面顶部先点「设置」并勾选启用,密钥只是摆设
- 测试连接失败大概率是 RAM 子用户权限不足:阿里云需
Alidns:DescribeDomainRecords和Alidns:AddDomainRecord,缺一不可
域名输入格式和组合必须严格按 ACME 规则
泛域名证书不是光写 *.example.com 就完事。ACME 要求主体明确,且 *.example.com 不覆盖 example.com(根域)本身,也不覆盖二级子域(如 a.b.example.com)。
- 正确写法:
*.example.com,example.com(逗号分隔,无空格) - 想加 www:
*.example.com,example.com,www.example.com,但注意 Let’s Encrypt 单证书最多 100 个域名,别堆满 - 错误写法:
**.example.com、*.sub.example.com、*、example.com单独存在——全部被拒 - Cloudflare 用户注意:API Token 必须含
Zone:Read和DNS:Edit权限,仅Account:Read不行
自动续期不会默认开启,必须手动确认 cron 任务
DNS 模式申请成功后,证书有效期仍是 90 天,但宝塔不会像 HTTP 模式那样自动创建续期计划任务。到期前 20 天面板右上角会出黄色提醒,点进去看「自动续签」开关仍是灰色——这是正常表现,不是 bug。
- 续期依赖相同的 DNS API 凭据,宝塔不默认复用,需人工干预
- 检查「计划任务」里是否有名为
Let's Encrypt 自动续签的任务,且执行周期是否为每月一次(推荐设为每月 1 日 03:00) - 若没有,需手动添加:任务类型选「Shell 脚本」,命令填
/www/server/panel/pyenv/bin/python /www/server/panel/class/acme_v2.py --renew,并确保脚本有读取 DNS API 配置的权限 - 更稳妥的做法:在申请成功后立刻点证书右侧的「续签」按钮,看是否能立即跑通一次,验证整个链路
最易忽略的一点:DNS API 凭据一旦变更(比如阿里云 AccessKey Secret 轮换),所有已部署的泛域名证书续期都会静默失败,且面板不报警——必须定期检查「SSL」页各证书的「到期时间」和「续签状态」列。


















