发布于2026-07-19 阅读(0)
扫一扫,手机访问
配置泛域名SSL证书,在宝塔面板里其实是个很典型的“一步到位但容易踩坑”的操作。很多人照着流程走下去,最后发现子域名还是报证书错误,或者续期的时候悄无声息地失败了。这些问题,归根结底就出在验证方式、域名填写、续期配置和Nginx处理这四个环节上。下面逐个拆开来看。
 ### 泛域名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 ~^(?上一篇:c++如何获取文件夹占用的空间大小_递归计算目录容量【详解】
下一篇:PHP怎么使用Eloquent Attribute Game States属性游戏状态_Laravel游戏逻辑建模【技巧】
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8