DNS-01 (DNS-01 验证)
定义
DNS-01 是一种 ACME 验证方式,客户端在 _acme-challenge 子域名下发布由 CA 质询计算出的 TXT 记录来证明域名控制权。
DNS-01 是通过 DNS 完成验证的 ACME 质询。客户端对密钥授权内容做 SHA-256 摘要并进行 base64url 编码,作为 TXT 记录发布到 _acme-challenge.example.com;CA 从多个网络视角查询这个名字并比对取值。它是唯一能验证通配符证书的 ACME 方法,服务器完全不对公网开放时也能使用。
为什么重要
DNS-01 让证书与 Web 服务器解耦:一台持有 DNS API 密钥的机器就能为内网主机、负载均衡集群或通配符域名申请证书,再分发部署。代价在于安全和时序:DNS API 密钥权限很大,应尽量缩小授权范围(例如阿里云 RAM 子账号只授予云解析权限);记录必须在所有权威服务器上生效后 CA 才能查到。常见的加固做法是把 _acme-challenge 用 CNAME 指向一个单独的域,ACME 客户端只需要那个域的写权限。CAA 记录照常生效。
例子
用 acme.sh 调用 DNSPod 接口,同时申请主域名和通配符证书:
export DP_Id="<id>" DP_Key="<key>"
acme.sh --issue --dns dns_dp -d example.com -d '*.example.com'
# 查看 CA 将会看到的记录
dig TXT _acme-challenge.example.com +short
使用阿里云云解析时,把插件换成 dns_ali,并设置 Ali_Key、Ali_Secret 即可。
常见误区
- DNS-01 需要网站服务器在线。 它只依赖 DNS,服务器可以离线或只在内网。
- TTL 设得小,记录就能立刻生效。 TTL 影响的是缓存时间,而不是 DNS 服务商把记录同步到所有权威服务器的速度。
- 通配符证书包含主域名。 *.example.com 并不匹配 example.com,需要同时申请两个名字,此时同一个 _acme-challenge 下会有两条 TXT 记录。