ACME(Automated Certificate Management Environment,自动证书管理环境)是使免费、自动化 SSL 证书成为可能的协议。它是 Let’s Encrypt——以及你的 ACME 客户端(GetHTTPS、Certbot、acme.sh)——与证书颁发机构实际通信的方式。
定义于 RFC 8555,ACME 用一个完全自动化的、密码学安全的协议取代了旧的手动流程(通过邮件向 CA 发送 CSR、等待人工审核)。
ACME 工作原理——5 个步骤
┌──────────┐ ┌──────────────┐
│ Client │ ① Account Registration │ CA Server │
│ (GetHTTPS)│ ──────────────────────────→ │ (Let's Encrypt)
│ │ ② New Order (domains) │ │
│ │ ──────────────────────────→ │ │
│ │ ③ Complete Challenges │ │
│ │ ←─────────────────────────── │ │
│ │ ──────────────────────────→ │ │
│ │ ④ Finalize (send CSR) │ │
│ │ ──────────────────────────→ │ │
│ │ ⑤ Download Certificate │ │
│ │ ←─────────────────────────── │ │
└──────────┘ └──────────────┘
步骤 1:账户注册
客户端生成 ACME 账户密钥对并向 CA 注册公钥。此密钥在未来请求中标识你——每条 ACME 消息都用它签名。
无需邮件、无需密码、无需个人信息。
步骤 2:创建订单
客户端提交要获取证书的域名列表。CA 创建一个”订单”并返回一组”授权”——每个域名一个——每个授权包含需要完成的验证。
步骤 3:完成验证
对于每个域名,客户端必须证明控制权。CA 提供验证类型:
| 验证方式 | 工作原理 | 使用场景 |
|---|---|---|
| HTTP-01 | 在 /.well-known/acme-challenge/ 放置文件 | 最常见、最简单 |
| DNS-01 | 在 _acme-challenge.domain 添加 TXT 记录 | 通配符、无 80 端口 |
| TLS-ALPN-01 | 在端口 443 用特殊 TLS 证书响应 | 80 端口被封、无 DNS 访问 |
客户端完成验证后通知 CA 来检查。CA 从其服务器验证——如果验证通过,授权标记为有效。
步骤 4:完成订单(发送 CSR)
所有域名授权通过后,客户端发送包含证书公钥的 CSR(证书签名请求)。CA 签名并创建证书。
步骤 5:下载证书
客户端下载签名的证书链——你的证书 + 中间 CA 证书。完成。
ACME 安全模型
每个 ACME 请求都使用账户密钥通过 JWS(JSON Web Signature) 签名。这防止了:
- 重放攻击 —— 每个请求有唯一的 nonce
- 篡改 —— 签名覆盖整个请求体
- 冒充 —— 只有账户密钥持有者能发起请求
账户密钥永远不离开客户端。使用 GetHTTPS 时,它通过 Web Crypto API 在浏览器中生成。
GetHTTPS 如何使用 ACME
GetHTTPS 在浏览器中运行的 JavaScript 中实现完整的 ACME 协议:
- 账户密钥通过
crypto.subtle.generateKey()(Web Crypto API)生成 - 证书密钥以相同方式生成
- ACME 消息通过
crypto.subtle.sign()签名 - CSR 使用 pkijs 库构建
- 直接与
acme-v02.api.letsencrypt.org进行 HTTPS 通信
无服务器端代理、无中间件。你的浏览器直接与 Let’s Encrypt 的 ACME API 通信。这很独特——大多数 ACME 客户端运行在服务器上。
ACME 客户端对比
| 客户端 | 运行环境 | ACME v2 | 自动续签 | 语言 |
|---|---|---|---|---|
| GetHTTPS | 浏览器 | ✅ | ❌ 手动 | JavaScript |
| Certbot | 服务器 CLI | ✅ | ✅ | Python |
| acme.sh | 服务器 CLI | ✅ | ✅ | Shell |
| Caddy | Web 服务器 | ✅ | ✅ | Go |
| Traefik | 反向代理 | ✅ | ✅ | Go |
| Lego | CLI 库 | ✅ | ✅ | Go |
支持 ACME 的 CA
ACME 由 Let’s Encrypt 创建,但现在是多个 CA 使用的开放标准:
| CA | ACME 目录 URL | 免费? |
|---|---|---|
| Let’s Encrypt | acme-v02.api.letsencrypt.org/directory | ✅ |
| ZeroSSL | acme.zerossl.com/v2/DV90 | 有限免费 |
| Buypass | api.buypass.com/acme/directory | ✅ |
| Google Trust Services | 通过 Google Cloud ACME | ✅ |
| DigiCert | 企业 ACME 端点 | 付费 |
| Sectigo | 企业 ACME 端点 | 付费 |
常见问题
ACME 和 Let’s Encrypt 是同一个东西吗?
不是。ACME 是协议(RFC 8555)。Let’s Encrypt 是使用 ACME 的证书颁发机构。其他 CA(ZeroSSL、Buypass、Google)也支持 ACME。可以类比 HTTP 和 Google——HTTP 是协议,Google 是使用它的服务。
我能实现自己的 ACME 客户端吗?
可以。协议完全规范于 RFC 8555。GetHTTPS 是基于浏览器的实现示例。大多数语言都有库(Python 的 certbot、Go 的 lego、JavaScript 的 acme.js)。
什么是 ACME v2?
ACME v2 是当前版本(RFC 8555),增加了通配符证书支持并取代了草案 v1 协议。所有现代 ACME 客户端使用 v2。Let’s Encrypt 于 2021 年关闭了 v1 端点。
如果 ACME 服务器宕机会怎样?
现有证书继续工作(它们不会回连验证)。你只是在恢复前无法签发或续签。Let’s Encrypt 有高可用性和冗余基础设施。