给内网域名签发通配符证书:用 DNS-01 CNAME 委托绕开 API 权限
内网服务想要 HTTPS,主域 DNS 又不在自己手里?本文演示用一条 CNAME 记录把 DNS-01 验证委托到可自动化的子域,完成通配符证书的签发、续期和部署验证。

团队里有台跑在内网的 Grafana,地址是 grafana.internal.example.com。浏览器天天弹"您的连接不是私密连接",点"继续访问"点了两年。想上证书,卡在两个地方:内网 IP 没法做 HTTP-01 验证,主域 example.com 的 DNS 又是另一个部门管的,要 API 权限得走审批。
这两个坑其实都能用 DNS-01 加 CNAME 委托绕过去。
前置条件
- 一台能出网访问 ACME 服务(比如 Let's Encrypt)的机器,跑签发客户端
- 你能在一个"可自动化"的 DNS 区域里加记录。可以是一个单独的子域,也可以是另一个完全由运维控制的域名。下文假设用
acme.example.net(一个你手里有 API 权限的辅助域名) - 主域能加一条静态 CNAME 记录。这一条只需要加一次,之后续期不再碰主域
原理一句话
DNS-01 验证要求你在 _acme-challenge.grafana.internal.example.com 下放一条 TXT 记录。ACME 服务器查询时允许跟随 CNAME,所以你可以把它指向 acme.example.net 下的某个名字,然后在那个区域里用 API 自动写 TXT。验证过了,证书就是你的——ACME 只认 DNS 控制权,不认这台服务器在哪、IP 是公网还是内网。
具体委托规则见 RFC 8555 第 8.4 节 对 DNS 挑战的定义。
步骤
1. 在主域加一次 CNAME
_acme-challenge.internal.example.com. CNAME _acme-challenge.internal.example.com.acme.example.net.注意委托的对象是 _acme-challenge.<你要签的域名>。如果要签 *.internal.example.com 通配符,委托点就是 _acme-challenge.internal.example.com 本身。
2. 在 CertbotX 中配置委托区域并签发
在 CertbotX 中实践:把 acme.example.net 配置为 DNS-01 的委托凭据(填它所在 DNS 服务商的 API 密钥),然后为 *.internal.example.com 提交 ACME 签发任务。CertbotX 会识别 CNAME 委托,把 TXT 记录写到委托区域完成验证,签发成功后记录部署结果,并在到期前自动重新签发——不需要你盯着日历。
签发完成后建议顺手配置部署目标。CertbotX 支持把新证书自动推送到 Agent(装在目标服务器上的部署端)、EdgeOne 或其他 CDN,每次续期后自动更新,部署记录可审计。内网这台 Grafana 就装个 Agent,证书落地后由它触发 nginx -s reload。
3. 验证证书
别只看签发成功的日志,在客户端侧验一下:
openssl s_client -connect grafana.internal.example.com:443 -servername grafana.internal.example.com </dev/null 2>/dev/null | openssl x509 -noout -subject -issuer -dates确认三点:Subject 或 SAN 覆盖你的域名、有效期是新的、issuer 是你预期的 CA。再用浏览器访问一次,锁头图标出现才算完事——内网机器记得给客户端分发对应 CA 链(公共 CA 一般不用操心,但如果走的是私有 CA 就要推根证书了)。
4. 验证续期链路
首次签发成功后,人为触发一次重新签发(大多数客户端支持 --force-renewal 之类的选项,CertbotX 里也可以手动触发任务),确认 DNS 委托写入、证书更新、部署到目标这三段链路都通。续期是这条链路的常态,首签只是开张。
几个容易踩的坑
- CNAME 层级别搞错:是
_acme-challenge那条记录做 CNAME,不是业务域名本身。把业务域名 CNAME 出去,流量就跟着跑了。 - 通配符不覆盖裸域名:
*.internal.example.com不含internal.example.com本身,两个都要就一起签。 - TXT 传播时间:委托区域的 DNS 服务商 API 写入后,权威服务器生效可能要几十秒。签发客户端一般会等,但 DNS 配置特别复杂的区域值得先手动
dig TXT试一下延迟。 - 委托区域的安全边界:拿到
acme.example.net写入权限的人,等于能替你名下所有委托过去的域名签证书。这个区域的 API 密钥按生产凭据对待。
相关文档
- RFC 8555:ACME 协议与 DNS-01 挑战定义——理解委托为什么合法的原文依据
- Let's Encrypt 文档:DNS-01 挑战——官方对各类验证方式的说明
- nginx HTTPS 服务器配置——证书签下来之后的落地配置参考


