ACME的三种验签
Contents
CA/Browser Forum 行业标准
所有合规的 CA(如Let’s Encrypt等)都必须遵守一套全球通用的规则,叫做 Baseline Requirements。在这套规则里,明确规定了CA必须通过下面的几类方式之一来验证域名的控制权:
- 文件验证(HTTP Based):在约定的路径放个东西
- DNS验证(DNS Based):在DNS记录里加个东西
- 邮件验证(Email Based):给管理员邮箱发送验证码。这是传统方式,由于邮件难以自动化,所以ACME不支持。
ACME协议标准
这里简单提一下,ACME是协议标准,acme.sh是实现这个协议的客户端工具,二者不同。
文件验证,也就是在网站放文件的思路虽然是通用的,但是没有ACME协议之前,每个CA厂商对文件名、文件内容、文件路径等的要求都不一样。
ACME协议的作用就是把这些验证动作标准化。它定义了 HTTP-01、DNS-01、TLS-ALPN-01 这三种具体的“挑战”流程,只要是支持ACME协议的CA,它们对文件路径、文件内容、文件格式、DNS记录名的要求都是完全一致的。
HTTP-01
这是最常用、最基础的验证方式,适用于拥有独立的服务器和Web服务的场景,acme.sh 的默认验证方式就是 HTTP-01。
交互逻辑
- 下单:acme.sh 告诉 CA:“我要为 aetherial.cn 申领证书”。
- 出题:CA 给出一个随机 Token(令牌),并告知 acme.sh 预期的内容。
- 答题:acme.sh 在网站根目录创建路径
/.well-known/acme-challenge/<TOKEN>,并将 CA 要求的内容写入该文件。 - 改卷:CA 通过 HTTP 协议访问
http://aetherial.cn/.well-known/acme-challenge/<TOKEN>。如果能获取到正确内容,验证通过。
技术细节
- CA 初始请求必须走 80 端口。虽然 CA 支持重定向(HTTP -> HTTPS),但首跳必须是 80。
- 验证具有临时性,验证完成后文件就可以删除
优缺点
- 优点:配置简单,无需域名 API 权限,不依赖 DNS 传播。
- 缺点:不支持通配符证书;必须暴露 80 端口;对于负载均衡(多节点)环境,需要保证所有节点都能访问到该文件。
DNS-01
这是唯一支持通配符证书的方式,也是最灵活的方式。
交互逻辑
- 下单:acme.sh 申请
*.aetherial.cn(通配符)。 - 出题:CA 要求在域名下添加一条 TXT 类型的解析记录。
- 答题:acme.sh 在 DNS 解析中添加主机记录
_acme-challenge.aetherial.cn,值为 CA 给出的随机字符串。 - 改卷:CA 查询全球 DNS 缓存,一旦查到对应的 TXT 记录值正确,验证通过。
技术细节
- 需要域名 API 权限(如 阿里云、Cloudflare 等)来完成自动化的流程。
- 通配符证书支持:
*.aetherial.cn可以覆盖所有子域名。 - DNS 传播时间:通常需要几分钟到几小时,取决于 DNS 缓存刷新。
优缺点
- 优点:支持通配符证书;无需暴露 Web 服务;无需公网IP,无需开放80端口。
- 缺点:需要域名 API 权限;DNS 传播时间较长。
TLS-ALPN-01
这是一种较新的方式,它在 TLS 协议层完成验证,不需要任何 HTTP 资源或 DNS 修改。一般的使用场景是 443 端口已经有服务运行,但是不想中断它,可以使用这种方式启动一个临时的TLS服务来完成验证。
交互逻辑
- 下单:客户端向 CA 申请证书。
- 出题:CA 同样给出一个 Token。
- 答题:客户端在 443 端口上临时构造一个特殊的自签名证书,该证书的 Subject Alternative Name 包含该 Token。
- 改卷:CA 通过 TLS 握手连接客户端的 443 端口,并在握手过程中使用 ALPN(应用层协议协商)指定协议为
acme-tls/1。如果 CA 接收到包含正确 Token 的证书,验证通过。
技术细节
- 非 HTTP 流,它不占用 HTTP 路径,而是利用了 TLS 握手阶段的特性。
- 原生 Nginx 或 Apache 很难支持,因为它们不具备动态更改 TLS 握手内容的能力。通常由 Caddy 等集成化 Web Server 或专门的监听程序(如 acme.sh 的 standalone 模式)实现。
优缺点
- 优点:只需开启 443 端口(适合 80 端口被封锁的环境);对文件系统无侵入。
- 缺点:不支持通配符;实现门槛高,需要 Web 服务器软件的深度支持;必须有公网 IP。
总结对比
| 特性 | HTTP-01 | DNS-01 | TLS-ALPN-01 |
|---|---|---|---|
| 验证端口 | 80 (HTTP) | 无需端口 | 443 (HTTPS) |
| 通配符支持 | ❌ 不支持 | ✅ 唯一支持 | ❌ 不支持 |
| 内网支持 | ❌ 需公网访问 | ✅ 完美支持 | ❌ 需公网访问 |
| 核心依赖 | Web Server / 文件系统 | DNS API 权限 | TLS 握手层支持 |
| 适用工具 | acme.sh / Certbot | 各云厂商 API | Caddy / Standalone |
