商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > 宝塔面板如何配置泛域名SSL证书_使用DNS API接口自动申请

宝塔面板如何配置泛域名SSL证书_使用DNS API接口自动申请

  发布于2026-07-19 阅读(0)

扫一扫,手机访问

配置泛域名SSL证书,在宝塔面板里其实是个很典型的“一步到位但容易踩坑”的操作。很多人照着流程走下去,最后发现子域名还是报证书错误,或者续期的时候悄无声息地失败了。这些问题,归根结底就出在验证方式、域名填写、续期配置和Nginx处理这四个环节上。下面逐个拆开来看。

![宝塔面板如何配置泛域名SSL证书_使用DNS API接口自动申请](http://img.318050.com/uploads/20260415/177620348469deb6dcba9dc685074171.webp) ### 泛域名SSL在宝塔里必须用DNS验证,HTTP验证行不通 泛域名证书有个关键特征——它走的是DNS-01挑战,没法用HTTP方式验证。ACME协议对此有明确规定。如果你在宝塔面板里点了“文件验证”或“自动验证”,日志里大概率会看到类似 `Cannot issue for "*.xxx": Domain is not valid for issuance` 或 `NS error: No TXT record found` 的提示。不是宝塔出了问题,是验证路径从一开始就选错了。 解决办法是手动切换到DNS API模式,前提是你的DNS服务商在ACME支持列表里。阿里云、腾讯云、Cloudflare是最常用的几家。具体操作上,有几个要点得注意: - 确认域名DNS解析托管在支持的平台(比如阿里云云解析DNS),并且账号有API权限。如果是RAM子用户,需要授予 `Alidns:DescribeDomainRecords` 和 `Alidns:AddDomainRecord` 这类权限。 - 在宝塔「网站」→「SSL」→「其他证书」→「Let's Encrypt」里,别急着点“申请”。先点右上角的“设置”,勾选“使用DNS API验证”。 - 下拉选择对应的DNS服务商,填入 `AccessKey ID` 和 `AccessKey Secret`(阿里云)或 `API Token`(Cloudflare)。注意Cloudflare的Token需要带 `Zone:Read` 和 `DNS:Edit` 权限。 ### 填泛域名时必须带星号且只填一级通配符 申请框里写 `*.example.com` 是对的,但要是写成 `*.sub.example.com` 或 `**.example.com`,就没法通过——ACME不允许多级通配或嵌套通配。另外,不能只填 `*` 或 `example.com`。泛域名证书必须显式包含 `*.` 前缀,而且主域名(`example.com`)也建议一并加入,不然访问根域名时会提示证书不匹配。 推荐的做法是这样填:`*.example.com,example.com`(逗号分隔,无空格)。如果需要覆盖 `www.example.com`,可以再加进去:`*.example.com,example.com,www.example.com`。不过要注意,Let's Encrypt单张证书最多支持100个域名,泛域名本身已经占了一个主体,别堆太多。 填完之后别急着提交。先点一下“测试DNS API”按钮——宝塔会尝试添加一条临时TXT记录并查询,成功才说明凭证和权限没问题。 ### 自动续期依赖cron任务,但宝塔默认不自动启用 用DNS API模式申请成功后,证书的有效期是90天。但宝塔不会像HTTP模式那样自动挂载续期任务。如果你没有手动干预,到期前20天左右面板右上角会出现黄色提醒,点进去看“自动续签”开关仍然是灰色的。这是正常现象,因为DNS续期需要复用相同的API凭据,宝塔不会默认帮你保存并触发。 解决方案是手动配置一个计划任务: - 进入「计划任务」→「添加计划任务」,任务类型选「Shell脚本」,执行周期设为「每天03:00」(避开Let's Encrypt的请求高峰)。 - 脚本内容可以填:`bt 71 && bt 72`(`bt 71`重载SSL配置,`bt 72`强制续签所有可续签证书)。 - 更稳妥的做法是单独指定站点续签:`/www/server/panel/pyenv/bin/python /www/server/panel/class/acme_v2.py --renew=www.example.com`,把 `www.example.com` 换成你实际的主域名。 ### 证书部署后Nginx配置要手动检查server_name 宝塔生成的泛域名证书虽然绑定了,但默认站点配置里的 `server_name` 可能还是写的具体域名(比如 `www.example.com`)。这会导致 `api.example.com` 或 `shop.example.com` 访问时走不到这个HTTPS配置,浏览器报 `NET::ERR_CERT_COMMON_NAME_INVALID`。 需要手动处理一下: - 进入「网站」→「设置」→「配置文件」,找到 `server_name` 行,改成 `server_name *.example.com example.com;`。 - 注意,Nginx不支持 `server_name *` 这种写法,必须写完整通配格式。如果子域名太多,也可以用正则:`server_name ~^(?.+)\.example\.com$;`,但需要配合 `ssl_certificate` 和 `ssl_certificate_key` 动态加载——宝塔不原生支持,得手写逻辑。 - 改完之后务必点“重载配置”,别只保存。否则reload不生效,HTTPS仍然会fallback到默认站点或报错。 最容易被忽略的是DNS API权限粒度和续期脚本的执行权限。RAM子用户如果只给了读权限,申请能过,续期会卡在“添加TXT记录失败”。而cron任务默认以 `root` 身份运行,但部分云厂商的SDK(比如腾讯云)要求 `~/.tencentcloud/credentials` 文件存在,得提前配好,或者改用环境变量方式传参。
本文转载于:https://www.php.cn/faq/2312948.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注