DNS 与 ACME 证书签发续期
来源:
intranet-tunnel/deploy/cloud/BAOTA-DEPLOY.md→## 四、证书:面板自带的 DNS-01 有缺陷,改用 acme.sh(原文 1085 字符)
四、证书:面板自带的 DNS-01 有缺陷,改用 acme.sh
缺陷现象
cert: 写入 DNS-01 TXT 记录失败: ddns: 阿里云返回错误 InvalidDomainName.NoExist根因(server/internal/cert/acme.go:312-315)
// 通配符证书的授权标识符是主域名(不带 *),TXT 记录写在其 _acme-challenge 下。
domain := strings.TrimPrefix(authz.Identifier.Value, "*.")
if err := dnsProv.EnsureRecord(ctx, domain, "_acme-challenge", "TXT", record, 60); err != nil {它把「ACME 授权标识符」直接当作 DNS 托管主域名传给服务商。 对 tunnel.sushike.cloud 而言 domain 就是它本身, 而阿里云云解析要求 DomainName 必须是托管主域 sushike.cloud,于是报域名不存在。 缺的是「待签域名 → DNS 托管主域」的解析(PSL 或用户显式配置)。
规避
用 acme.sh 以 DNS-01(dns_ali)签发,产物落到面板同一证书目录:
ALI_KEY=... ALI_SECRET=... CERT_EMAIL=... sh setup-acme.sh- 覆盖
tunnel.sushike.cloud+*.t.sushike.cloud(SAN) - 续期由 acme.sh 自带 cron 负责(每天 4/10/16/22 点),
--reloadcmd 已配成自动 nginx -s reload
- 不要再把该证书导入面板的证书模块:两边同时续期会互相干扰
另注:源码落后于镜像
面板 API 申请证书时会报「DNS-01 验证需要选择 DNS 服务商并填写凭据」, 但仓库源码里 handleCreateCert 并未把 dns_provider / dns_credentials 传给签发器, 且该报错文案在源码中不存在 —— 说明运行中的镜像比仓库源码新, 这是一处待对齐的差异(详见 issue-cert.sh 顶部注释)。
来源:
intranet-tunnel/deploy/cloud/README.md→## 五、证书申请(原文 415 字符)
五、证书申请
部署完成后,在面板里为域名申请证书:
- 进入「SSL 证书」→「申请证书」
- 填域名(面板域名 + 隧道域名各申请一张,或申请一张泛域名)
- 验证方式选 HTTP-01(需 80 端口可从公网访问,安全组已放行)
- 邮箱填
CERT_EMAIL的值
证书签发后落在宿主机 ./certs/<域名>/,含 cert.pem 与 key.pem,nginx 已挂载该目录。
申请完成后执行一次
docker compose restart nginx让 nginx 加载新证书。已知限制:证书自动续期后 nginx 不会自动重载,需要手动执行上面的 restart。 如需自动化,可以给 nginx 容器挂载 docker socket 并加 inotify 脚本 —— 但那会扩大容器的权限面,本项目默认不做。
