泛域名证书必须使用DNS-01验证,HTTP-01不支持;需在宝塔中配置有效DNS API密钥、显式填写*.example.com,example.com,www.example.com等完整域名列表,并通过“测试DNS API”验证后方可申请,否则续签将失败。

泛域名证书必须用 DNS 验证,文件验证不支持 *.example.com
Let’s Encrypt 对泛域名(*.example.com)只允许 DNS-01 验证方式。HTTP-01(即文件验证)要求每个子域都能响应 HTTP 请求,而通配符本身不指向具体服务器,所以宝塔里选「文件验证」后填 *.example.com 会直接失败,面板可能卡在“正在验证”或报错 Invalid response from http://_acme-challenge.*.example.com。
你得确认两点:一是你的 DNS 服务商在宝塔支持列表里(阿里云、Cloudflare、腾讯云 DNSPod 等),二是你有对应 API 权限——不是账号密码,而是能调用 DNS 接口的密钥。
- 阿里云必须用 RAM 子账户 +
AliyunDNSFullAccess权限,主账号 AccessKey 会被风控拦截 - Cloudflare 必须用 Token(非 Global API Key),且权限至少含
Zone:Read和DNS:Edit - 填错密钥格式或权限不足时,宝塔「测试 DNS API」按钮会提示
Failed to add TXT record或超时
填域名时必须显式写 *.example.com,example.com,不能只写 *.example.com
ACME 协议规定泛域名证书不自动包含根域名。如果你只填 *.example.com,访问 example.com 或 www.example.com 时浏览器会报证书不匹配(NET::ERR_CERT_COMMON_NAME_INVALID)。这不是宝塔 bug,是 Let’s Encrypt 的强制规则。
正确写法是在「域名」输入框里用英文逗号分隔,**无空格**:
*.example.com,example.com,www.example.com
-
*.example.com覆盖所有一级子域(如blog.example.com、api.example.com) -
example.com覆盖根域名 -
www.example.com是独立主体,需单独列出(否则 www 访问仍报错) - 单张证书最多 100 个域名,但泛域名已占一个 slot,别堆太多子域,否则申请直接被拒
「测试 DNS API」成功后才点「申请」,否则续期大概率失败
宝塔不会在申请成功后自动启用续期任务——它只在 DNS 验证首次通过时记录一次凭证,后续续签需要复用同一套密钥。如果跳过「测试 DNS API」直接点「申请」,很可能证书申请成功了,但到期前 20 天面板右上角出现黄色提醒,点进去发现「自动续签」开关仍是灰色的。
这是因为宝塔没确认你填的密钥真能干活。务必按顺序操作:
- 先点右上角「设置」→ 勾选「使用 DNS API 验证」→ 选择服务商 → 填入密钥
- 再点「测试 DNS API」按钮,等它返回绿色「测试成功」(背后是宝塔尝试添加并查询一条临时 TXT 记录)
- 最后回到主界面,填好域名,点「申请」
- 申请成功后,去「计划任务」里确认是否存在「Let’s Encrypt 自动续签」任务(路径通常是
/www/server/panel/pyproject/bin/python /www/server/panel/class/acme.py)
续期失败最常见的原因是 DNS 权限变更或密钥过期
自动续签不是一劳永逸。阿里云 AccessKey Secret 不会自动轮转,Cloudflare Token 可能被手动删除或权限回收。一旦密钥失效,续签任务执行时会报错 Unauthorized 或 Permission denied,但宝塔默认不告警,只静默失败。
建议每月手动检查一次:
- 登录阿里云 RAM 控制台,确认子账户状态正常、
AliyunDNSFullAccess仍绑定 - 进宝塔「网站」→「SSL」→ 找到该证书 → 点「续签」,看是否弹出错误;若提示「无法连接 DNS 服务」,立刻重做「测试 DNS API」
- 不要依赖面板右上角的黄色提醒——它只在到期前 20 天触发一次,错过就只能手动重签
最麻烦的其实是 NS 服务器被锁死:有些注册商(比如阿里云自己)把域名 NS 改成 dns1.hichina.com 这类自家地址后,DNS API 调用反而失败。临时切回中立 NS(如 ns1.dnspod.net)常能绕过。











