DNS · CNAME
DNS 与 CNAME
平台用 DNS-01 校验域名归属。你只需要发布一条 CNAME,把 _acme-challenge 指到平台,
剩下的校验应答由平台完成。
为什么不是 HTTP-01
Let's Encrypt 支持两种校验方式:
| 方式 | 要求 | 泛域名 | 常见问题 |
|---|---|---|---|
| HTTP-01 | 80 端口对外可访问,能写入 /.well-known/acme-challenge/ | 不支持 | 防火墙、CDN 回源、反代拦截都会导致失败 |
| DNS-01 | 能改一条 DNS 记录 | 必须用这个 | 只需等解析生效 |
泛域名证书(*.example.com)只能通过 DNS-01 签发。这也是为什么平台不需要你开放任何端口。
这条记录到底怎么填
以阿里云云解析为例,添加记录的界面大致是这样:
| 字段 | 值 |
|---|---|
| 记录类型 | CNAME |
| 主机记录 | _acme-challenge |
| 记录值 | 平台域名详情页显示的那一串,例如 a1b2c3d4.sethttps.com |
| 解析线路 | 默认 |
| TTL | 600 或最小值 |
只有一条。泛域名证书只校验主域名
example.com,*.example.com 的子域名不需要各自添加记录。
如果之后又添加了 api.example.com 这样的独立证书,才会多出一条 _acme-challenge.api。
阿里云 / 腾讯云 DNSPod
- 进入域名解析列表,找到要签发证书的主域名,点「解析设置」
- 「添加记录」→ 记录类型选
CNAME - 主机记录填
_acme-challenge(不要带域名后缀,也不要带点) - 记录值粘贴平台给的那一串(不要加
http://,不要加结尾的点) - 保存,回到平台点「验证」
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 不能与其它记录共存,先删除 |