0
0
0

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 字符)

五、证书申请

部署完成后,在面板里为域名申请证书:

  1. 进入「SSL 证书」→「申请证书」
  2. 填域名(面板域名 + 隧道域名各申请一张,或申请一张泛域名)
  3. 验证方式选 HTTP-01(需 80 端口可从公网访问,安全组已放行)
  4. 邮箱填 CERT_EMAIL 的值

证书签发后落在宿主机 ./certs/<域名>/,含 cert.pemkey.pem,nginx 已挂载该目录。

申请完成后执行一次 docker compose restart nginx 让 nginx 加载新证书。

已知限制:证书自动续期后 nginx 不会自动重载,需要手动执行上面的 restart。 如需自动化,可以给 nginx 容器挂载 docker socket 并加 inotify 脚本 —— 但那会扩大容器的权限面,本项目默认不做。


支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或者给予支持!

评论