ACME 协议详解:RFC 8555 自动化证书管理的架构与实现

协议详解 · 2026-08-21

一、协议概述与设计动机

ACME(Automatic Certificate Management Environment,RFC 8555)是由互联网号码分配机构(IANA)标准化、IETF CFRG 工作组主导的证书管理协议。该协议定义了客户端与证书颁发机构(CA)之间的交互流程,实现了证书申请、验证、签发、续期和吊销的全生命周期自动化管理。

协议的设计动机源于传统 PKI 体系中证书管理的三大痛点:

手动签发成本高昂:在 ACME 之前,企业 CA 管理员需要通过 Web 控制台、API 或命令行工具手动提交证书签名请求(CSR)。对于大规模基础设施,如云服务商需要为成千上万个虚拟机分配证书时,这种模式完全不可行。

证书过期导致服务中断:证书过期是 TLS 服务中断的常见原因之一,自动化管理可显著降低人为错误风险。ACME 通过自动化续期机制将人为错误降至零。

密钥轮转困难:传统 PKI 体系中,即使发现密钥泄露,重新部署新证书也耗时数小时。ACME 支持快速吊销与重新签发,将响应时间缩短至秒级。

协议于 2018 年 3 月正式发布(RFC 8555)。后续 RFC 8738(2020 年 2 月)扩展了对 IP 地址标识符的支持。ACME 协议已被 Let's Encrypt、DigiCert、Sectigo 等主流 CA 广泛支持,Let's Encrypt、DigiCert、Sectigo 等主流 CA 均已支持。

二、核心概念模型

ACME 协议采用账户-订单-认证-挑战的四层模型,每层都有明确的状态机定义。

2.1 账户(Account)

账户是 ACME 协议的顶层实体,代表证书申请者的身份。账户创建通过 newAccount 接口完成,支持三种模式:

仅创建:客户端提供公钥,CA 生成账户对象,不验证身份。适用于内部 PKI 或测试环境。

创建并验证:CA 要求客户端证明对特定标识符(域名、IP 地址)的控制权,验证通过后激活账户。这是公共 CA 的标准流程。

更新现有账户:客户端可以修改账户的联系人信息(电子邮件)、接受服务条款,或请求吊销关联的所有证书。

账户对象包含以下关键字段:

JSON
{
  "status": "valid",
  "contact": ["mailto:admin@example.com"],
  "termsOfServiceAgreed": true,
  "orders": "https://acme.example.com/accounts/12345/orders"
}

2.2 订单(Order)

订单代表一次证书签发请求,包含客户端期望申请的证书参数和验证进度。订单创建通过 newOrder 接口完成,客户端必须指定:

标识符列表:要签发的证书覆盖的域名(DNS Identifier)或 IP 地址(IP Identifier)。每个标识符需要单独验证。

最小生命周期:期望的证书有效期,CA 可能拒绝过长的请求。

扩展参数:可选的证书策略、密钥类型偏好等。

订单对象的核心字段包括:

订单状态机有五种状态:

  • pending:订单已创建,等待客户端完成验证
  • ready:客户端已完成所有验证,等待 CA 签发
  • processing:CA 正在签发证书
  • valid:证书已成功签发
  • invalid:验证失败或签发错误

2.3 认证(Authorization)

认证代表对单个标识符控制权的验证结果。每个订单中的标识符都必须有对应的认证对象。

认证包含三类关键信息:

标识符:被验证的域名或 IP 地址。

状态:pending、valid、deactivated、revoked、expired。

挑战列表:CA 提供的可选择的验证方法。

2.4 挑战(Challenge)

挑战是 CA 用于验证客户端控制权的特定协议操作。每种挑战类型有不同的实现方式,但都遵循相同的交互模式:CA 提供挑战详情 → 客户端执行挑战 → CA 验证结果。

三、完整协议流程

ACME 协议的核心交互流程如下:

步骤 1:发现 CA 端点

客户端通过访问 CA 的目录接口获取协议元数据。目录接口返回所有可用端点的 URLs 和协议版本信息。

BASH
# 获取 Let's Encrypt 目录
curl -s https://acme-v02.api.letsencrypt.org/directory

响应包含 newNonce、newAccount、newOrder、revokeCert 等端点。客户端必须在使用每个端点前获取 Nonce(防重放令牌),通过 GET /new-nonce 获取。

步骤 2:创建账户

客户端发送 JWS(JSON Web Signature)保护的 newAccount 请求:

JSON
POST /acme/new-account HTTP/2
Content-Type: application/jose+json

{
  "protected": "<base64url header>",
  "payload": "<base64url {\"onlyReturnExisting\": false}>",
  "signature": "<base64url signature>"
}

CA 返回账户 URL。客户端使用该 URL 进行后续请求的身份绑定。

步骤 3:创建订单

客户端发送 newOrder 请求,指定要签发的证书参数:

JSON
POST /acme/new-order HTTP/2
Content-Type: application/jose+json

{
  "protected": "<base64url header>",
  "payload": "<base64url {\"identifiers\": [{\"type\": \"dns\", \"value\": \"example.com\"}]}>",
  "signature": "<base64url signature>"
}

CA 返回订单对象,包含 authorizations URLs 和当前状态。

步骤 4:完成挑战验证

客户端遍历订单中的每个标识符,选择可用的挑战类型并完成验证。以 DNS-01 挑战为例:

CA 返回挑战对象:

JSON
{
  "type": "dns-01",
  "status": "pending",
  "token": "EhX5w3q1Y3o1X1c1X1c1X1c1X1c1X1c1X1c1X1c1X1c",
  "validationRecord": []
}

客户端计算 key authorization:

客户端通知 CA 验证已完成:

JSON
POST /acme/chall/xxx HTTP/2
{
  "type": "dns-01",
  "url": "https://acme.example.com/chall/xxx",
  "status": "pending"
}

CA 异步验证:CA 检查 DNS TXT 记录是否正确,验证通过后更新挑战状态为 valid。

步骤 5:证书签发

当所有挑战状态变为 valid 时,订单状态变为 ready。客户端轮询订单状态,或等待 CA 推送通知。

客户端请求签发:

JSON
POST /acme/order/xxx/finalize HTTP/2
{
  "csr": "<base64url CSR>"
}

CA 签发并返回证书:

JSON
{
  "status": "valid",
  "certificate": "https://acme.example.com/cert/yyy"
}

客户端通过证书 URL 下载 PEM 编码的证书链。

步骤 6:证书续期

证书到期前 30 天(标准建议),客户端重新执行步骤 3-5。ACME 协议支持 renewalInfo 端点查询最佳续期时间。

四、三种挑战类型详解

ACME v2 定义了三种标准挑战类型,每种对应不同的控制权验证方法。

4.1 HTTP-01 挑战

HTTP-01 验证客户端对 HTTP 服务器的控制权。

验证流程:

  • CA 提供 token(随机字符串)
  • 客户端计算 key authorization:base64url(sha256(thumbprint || '.' || token))
  • 客户端在 HTTP 服务器根路径创建文件:/.well-known/acme-challenge/,内容为 key authorization
  • CA 通过 HTTP GET 访问 http://domain/.well-known/acme-challenge/ 验证内容
  • 验证成功后挑战状态变为 valid
适用场景:
  • 拥有公网 IP 的 Web 服务器
  • 反向代理(Nginx、Apache)后可直接配置
  • 不支持 DNS API 的简单部署
限制条件:
  • 需要端口 80 开放
  • 无法验证子域名(除非子域名有独立 HTTP 服务器)
  • 存在中间人攻击风险(CA 需验证证书)

4.2 DNS-01 挑战

DNS-01 验证客户端对 DNS 区域的管理权限。

验证流程:

  • CA 提供 token
  • 客户端计算 key authorization 和 validation value:base64url(sha256(key_authorization))
  • 客户端在 _acme-challenge. 创建 TXT 记录,内容为 validation value
  • CA 通过 DNS TXT 查询验证
  • 验证成功后挑战状态变为 valid
适用场景:
  • DNS 托管服务(Cloudflare、AWS Route 53、Aliyun DNS)
  • 动态 DNS 环境
  • 无法开放 80 端口的场景
优势:
  • 无需公网 IP
  • 验证速度快(DNS 传播通常 < 60 秒)
  • 支持通配符证书(*.example.com)
工程实践:

4.3 TLS-ALPN-01 挑战

TLS-ALPN-01 验证客户端对 TLS 服务器的控制权,是 HTTP-01 的安全增强版。

验证流程:

  • CA 提供 token
  • 客户端计算 key authorization
  • 客户端启动临时 TLS 服务器,监听 443 端口
  • TLS 服务器使用 ALPN 协议标识 acme-tls/1
  • 客户端返回 key authorization 作为证书 CN 字段
  • CA 发起 TLS 连接并验证证书
适用场景:
  • 只有 443 端口开放的服务器
  • 需要同时验证 TLS 配置的场景
限制条件:
  • 客户端需要能够控制 443 端口
  • 可能与现有 TLS 服务器冲突
  • CA 必须支持 TLS-ALPN 验证

五、国密环境下的 ACME 适配

当前 ACME 协议基于 RSA/ECC 密码体系设计,与国密 SM2/SM3/SM4 存在兼容性问题。以下是主要挑战和适配方案。

5.1 技术障碍

JWS 签名算法:ACME 使用 ES256(ECDSA P-256)或 RS256(RSA 2048)签名。国密场景需使用 SM2 签名算法,对应 JWS 算法标识符为 SM2-SM3(IETF 正在标准化)。

证书格式:ACME 返回的证书为 X.509 格式,包含 RSA/EC 密钥。国密证书需要包含 SM2 公钥和 SM2 签名算法 OID(1.2.156.10197.1.301)。

挑战机制:HTTP-01 和 DNS-01 挑战依赖域名控制权验证,与密码算法无关,可直接复用。但 TLS-ALPN-01 需要支持国密 TLS 握手。

5.2 适配方案

方案一:国密 ACME 扩展

通过 ACME 协议扩展机制定义国密支持:

JSON
{
  "acmeIdentifier": {
    "type": "sm2-certificate",
    "curve": "sm2p256v1"
  }
}

CA 签发包含 SM2 密钥的证书,客户端使用 SM2 私钥签名 JWS。

方案二:混合模式

保持 ACME 协议结构不变,仅替换密码算法:

  • JWS 签名:SM2-with-SM3(替代 ES256)
  • 证书密钥:SM2(替代 EC P-256)
  • 哈希算法:SM3(替代 SHA-256)
该方案需要 CA 和客户端同时支持国密扩展,目前处于试点阶段。

方案三:协议转换网关

在现有 ACME CA(如 Let's Encrypt)和国密系统之间部署转换网关:

CODE
┌─────────────┐     ACME/RFC8555     ┌─────────────┐
│  ACME 客户端 │ ◄─────────────────► │ 转换网关    │
└─────────────┘                      └──────┬──────┘
                                           │
                                           │ 国密内部协议
                                           ▼
                                    ┌─────────────┐
                                    │ 国密 CA     │
                                    └─────────────┘

网关负责协议转换和算法适配,客户端无需感知国密细节。

5.3 实施现状

截至 2026 年 8 月,国密 ACME 适配仍处于早期阶段:

  • Pebble(Let's Encrypt 测试 CA)支持国密扩展实验
  • CFCA( certfinance )和 上海 CA 提供私有 ACME 接口,非标准协议
  • IETF ACME 工作组正在推进 RFC 9xxx 系列标准化国密扩展
推荐方案:在国密内网环境中,优先采用转换网关方案;对外服务仍使用标准 ACME(RSA/ECC),通过双证书机制实现国密兼容。

六、安全分析与最佳实践

6.1 安全特性

ACME 协议通过多层机制保障安全:

Nonce 防重放:每个请求必须携带唯一 Nonce,CA 拒绝重复 Nonce,防止请求重放攻击。

账户绑定:所有操作通过 JWS 签名绑定账户私钥,攻击者无法伪造他人请求。

授权验证:证书签发前必须完成所有标识符验证,确保申请人对域名有控制权。

证书吊销:支持 revokeCert 端点,私钥泄露时可立即吊销证书。

6.2 常见安全风险

账户劫持:攻击者获取账户私钥后可申请任意域名的证书。防护:使用硬件安全模块(HSM)存储私钥,定期轮换。

DNS 劫持:DNS-01 挑战依赖 DNS 记录正确性,DNS 被篡改可能导致未授权签发。防护:使用 DNSSEC 保护 DNS 记录,或使用 DNS API 访问控制。

证书滥用:攻击者获得合法证书后用于中间人攻击。防护:结合证书透明度(CT)日志监控异常证书。

6.3 工程最佳实践

自动化续期:配置定时任务,在证书到期前 30 天自动续期:

BASH
# Cron 配置:每天检查证书有效期
0 3 * * * certbot renew --quiet && systemctl reload nginx

多环境隔离:生产环境和测试环境使用不同 CA 账户,避免误操作。

监控与告警:集成 Prometheus 指标导出,监控证书过期时间:

日志审计:记录所有 ACME 操作,包括账户创建、订单提交、证书签发和吊销,便于安全审计。

七、总结

ACME 协议(RFC 8555)通过标准化的账户-订单-认证-挑战模型,实现了证书全生命周期的自动化管理。三种挑战类型(HTTP-01、DNS-01、TLS-ALPN-01)适应了不同的部署场景,使自动化证书管理成为可能。

国密环境下的 ACME 适配面临 JWS 签名算法、证书格式、协议扩展等挑战,当前主要采用转换网关方案过渡。随着 IETF 国密扩展标准化推进,未来可能出现原生支持 SM2 的 ACME 实现。

对于企业 PKI 建设者,建议在现有基础设施中部署 ACME 客户端(如 Certbot、acme.sh),同时关注国密 ACME 标准进展,为未来合规需求做好准备。

参考资料