SetHttps
DNS · CNAME

DNS 与 CNAME

平台用 DNS-01 校验域名归属。你只需要发布一条 CNAME,把 _acme-challenge 指到平台, 剩下的校验应答由平台完成。

为什么不是 HTTP-01

Let's Encrypt 支持两种校验方式:

方式要求泛域名常见问题
HTTP-0180 端口对外可访问,能写入 /.well-known/acme-challenge/不支持防火墙、CDN 回源、反代拦截都会导致失败
DNS-01能改一条 DNS 记录必须用这个只需等解析生效

泛域名证书(*.example.com)只能通过 DNS-01 签发。这也是为什么平台不需要你开放任何端口。

这条记录到底怎么填

以阿里云云解析为例,添加记录的界面大致是这样:

字段值
记录类型CNAME
主机记录_acme-challenge
记录值平台域名详情页显示的那一串,例如 a1b2c3d4.sethttps.com
解析线路默认
TTL600 或最小值
只有一条。泛域名证书只校验主域名 example.com,*.example.com 的子域名不需要各自添加记录。 如果之后又添加了 api.example.com 这样的独立证书,才会多出一条 _acme-challenge.api。

阿里云 / 腾讯云 DNSPod

  1. 进入域名解析列表,找到要签发证书的主域名,点「解析设置」
  2. 「添加记录」→ 记录类型选 CNAME
  3. 主机记录填 _acme-challenge(不要带域名后缀,也不要带点)
  4. 记录值粘贴平台给的那一串(不要加 http://,不要加结尾的点)
  5. 保存,回到平台点「验证」

Cloudflare

在 DNS 记录页面添加 CNAME,Name 填 _acme-challenge,Target 粘贴平台记录值,Proxy status 必须是 DNS only(灰色云朵)。

橙云会导致验证失败。橙色云朵意味着流量经过 Cloudflare 代理,CNAME 的目标会被改写,平台收不到 Let's Encrypt 的查询。 Cloudflare 免费版不带泛域名代理,这也意味着证书签下来之后,*.example.com 仍然会正常解析到你的服务器。

自己验证是否生效

在任意一台有 dig 的机器上执行:

dig _acme-challenge.example.com CNAME +short

返回值和平台显示的一致,就说明已经生效。没有返回或返回别的值,就是还没同步或填错了。Windows 下可以用:

nslookup -type=CNAME _acme-challenge.example.com

TTL 决定缓存多久。如果你刚改过记录,最好等 TTL 时间过去再验证;急着上线可以把 TTL 先调到 60 秒。

常见错误

现象原因处理
验证一直 pending记录还没同步等 1–5 分钟重试;先本地 dig 确认
dig 返回空主机记录填成了完整域名,或记录值多了结尾的点主机记录只填 _acme-challenge
返回了别的值之前手工验证留下的 TXT/CNAME 没删删掉旧记录,只保留平台这一条
Cloudflare 下失败开了橙云代理改成 DNS only
添加记录报冲突同一主机名已有 A / TXT 记录CNAME 不能与其它记录共存,先删除