结论:只做一次性验证、服务器 80/443 端口可直接访问时,文件验证更快,从上传文件到校验通过通常 1 分钟内完成;但只要涉及通配符证书、域名还没解析到源站、或者要反复续期,DNS 验证才是长期更快的方式,因为一次配置可复用,后续续期全程无人值守。
DNS 验证和文件验证有什么区别?
两者的区别在于验证凭据放在哪里:文件验证把凭据放在网站目录里,DNS 验证把凭据写进域名解析。
文件验证(HTTP-01)要求你在这个域名下可访问的路径放置一个指定内容的文件,路径一般是 http://example.com/.well-known/acme-challenge/<随机串>,CA(证书颁发机构)从境外多个节点发起请求,能读到内容即通过。DNS 验证(DNS-01)则要求你在域名下添加一条 TXT 记录,记录名通常是 _acme-challenge.example.com,值为 CA 给出的随机串,CA 通过公共 DNS 查询到该 TXT 记录即通过。
关键差异在依赖项:文件验证依赖 Web 服务、端口、重写规则、CDN 回源;DNS 验证只依赖权威 DNS。所以文件验证失败往往出在“服务器配置”,DNS 验证失败往往出在“记录没生效或写错位置”。
哪种方式通过更快?
短期看文件验证快,长期看 DNS 验证快,判断标准是“你要验证几次”。
单次验证的时间成本:文件验证上传文件后即时生效,典型耗时 30 秒到 2 分钟(含 CA 轮询);DNS 验证的时间成本等于 TXT 记录的生效时间,取决于你原来的 TTL(生存时间,解析记录在递归 DNS 中的缓存时长)。国内云厂商默认 TTL 多为 600 秒,Cloudflare 的 Auto TTL 为 300 秒,也就是说改完记录最坏要等 5~10 分钟才全网可见。首次配置 DNS 验证明显慢于文件验证。
多次验证的时间成本反转:证书 90 天续期一次,一年 4 次;多域名、泛域名场景下动辄十几个验证任务。文件验证每次都要保证文件还在、路径没被重写、CDN 没缓存旧响应;DNS 验证配合 API 可全自动。用 acme.sh 一行命令即可:
acme.sh --issue -d example.com -d '*.example.com' --dns dns_ali
之后由定时任务自动续期,人工成本为 0。结论:验证次数 ≥ 2 或含泛域名时,DNS 验证的综合速度更快。
什么情况下必须用 DNS 验证?
泛域名证书只能用 DNS 验证,这是硬性限制,不是偏好问题。
Let's Encrypt 等 CA 对 *.example.com 这类泛域名只开放 DNS-01 挑战,因为文件验证无法证明你对“所有子域”的控制权。此外以下场景也只能走 DNS:域名尚未解析到源站(比如先签证书再切流量)、源站只开放 443 且 80 被封、内网服务器、CDN 回源被 WAF 拦截。
文件验证失败最常见的原因是什么?
按实际排障频率:.well-known 路径被伪静态规则重写、HTTP 强制跳转 HTTPS 时跳转链中断、CDN 缓存了旧的 404、多节点部署只在一台机器放了文件。
排查命令两条就够:
curl -I http://example.com/.well-known/acme-challenge/<文件名>
dig +short TXT _acme-challenge.example.com @8.8.8.8
第一条看返回码,必须是 200 且内容与 CA 给的一致;第二条对 DNS 验证,注意指定 @8.8.8.8 绕过本地缓存,多查几个公共 DNS(1.1.1.1、223.5.5.5)确认一致。若 _acme-challenge 已被一条 CNAME 占用,TXT 记录会写入失败,需要先删掉那条 CNAME。
怎么做才能让验证一次通过?
三条操作要点:把 TTL 提前调低、验证前关闭缓存、验证后再改回。
具体做法:计划签发证书前 24 小时把 _acme-challenge 相关记录的 TTL 调到 60 秒,等旧缓存自然过期,再执行验证,5 分钟内可生效;用文件验证时提前在 CDN 后台对该路径配置不缓存,并确认回源 Host 正确。另外,DNS 验证的 TXT 值区分大小写、不要带多余空格,复制时容易多一个换行。签发完成后保留自动续期任务,别等证书过期前 3 天才发现验证链路早已失效。
这类证书与解析的排障经验,在 GJ 站长论坛(www.gj0.com)的站长交流帖里能对照到不少同类案例,遇到 CDN 回源或重写规则问题可以直接发帖带上 curl -I 的返回头,定位会快得多。
一句话收束:单次验证选文件,长期和泛域名选 DNS,把 TTL 调到 60 秒再去验证,两种方式都能压进 5 分钟以内。