4. 证书颁发机构与ACME服务端

ACME 协议本身只是一套“申请—挑战—签发—续期”的标准化对话规则,真正决定证书能否签发、签发速度、有效期长度以及信任范围的,是背后的证书颁发机构(CA)与其 ACME 服务端实现。理解各服务端的差异,是设计自动化运维架构的前提:公网业务通常需要浏览器信任的公共 CA,而内网服务、测试环境、设备身份则更适合私有 ACME 服务端。

公共 CA 与私有 ACME 服务端的分工

公共 CA 的根证书预置在操作系统和浏览器信任库中,签发的证书可被公网客户端直接信任。它们通过 ACME 服务端对外提供接口,典型代表是 Let's Encrypt、ZeroSSL 和 Buypass。私有 ACME 服务端(如 step-ca、Pebble)则运行在自有基础设施内,根证书由自己掌控,需要手动分发到客户端信任库,但换来的是完全可控的签发策略、内网域名支持和离线可用性。

从接入角度看,所有 ACME 客户端(certbot、acme.sh、lego、Caddy 等)都遵循 RFC 8555,差异主要体现在目录 URL、账户注册方式、挑战类型支持、速率限制和证书有效期上。下面这张图对比了四类服务端的接入路径与关键差异。

ACME 客户端接入公共 CA 与私有服务端的路径对比 ACME 客户端 certbot / acme.sh / lego / Caddy 公共 CA(浏览器信任) Let's Encrypt 目录:acme-v02.api.letsencrypt.org/directory 有效期 90 天 · 支持 HTTP-01 / DNS-01 / TLS-ALPN-01 ZeroSSL 目录:acme.zerossl.com/v2/DV90 需 EAB 绑定 · 有效期 90 天 · 免费额度有限 Buypass Go 目录:api.buypass.com/acme/directory 有效期 180 天 · 无 EAB · 速率限制较宽松 私有 ACME 服务端(自签根) step-ca 目录:https://ca.internal:9000/acme/acme/directory 支持 ACME + 短有效期 · 可签发内网域名 · 需分发根证书 Pebble 目录:https://localhost:14000/dir Let's Encrypt 官方测试实现 · 仅用于 CI/协议验证 关键差异速记 公共 CA:信任即用,受速率限制,域名须公网可达 私有 CA:根证书自管,内网可用,策略完全可控 接入核心:替换 ACME 目录 URL → 注册账户(部分需 EAB)→ 选择挑战类型 → 签发并部署

公共 CA 的接入差异与实操要点

Let's Encrypt 是最广泛使用的公共 CA,其 ACME 目录地址为 https://acme-v02.api.letsencrypt.org/directory。它不需要 EAB(External Account Binding),账户注册只需提供邮箱即可。证书有效期 90 天,支持 HTTP-01、DNS-01 和 TLS-ALPN-01 三种挑战。其速率限制较严格,例如同一注册域名每周最多签发 50 张证书,这要求运维在设计续期策略时避免频繁重签。

ZeroSSL 的 ACME 目录为 https://acme.zerossl.com/v2/DV90,接入时通常需要 EAB 凭据(Key ID 和 HMAC Key),这些凭据需在 ZeroSSL 控制台生成。它的免费证书同样为 90 天有效期,但免费额度与账户绑定,适合作为 Let's Encrypt 的备用 CA。使用 acme.sh 接入 ZeroSSL 的典型命令如下:

export ZEROSSL_EAB_KID="your_kid"
export ZEROSSL_EAB_HMAC_KEY="your_hmac_key"
acme.sh --register-account --server zerossl \
  --eab-kid "$ZEROSSL_EAB_KID" \
  --eab-hmac-key "$ZEROSSL_EAB_HMAC_KEY"

Buypass Go 的目录为 https://api.buypass.com/acme/directory,最大特点是证书有效期 180 天,且不需要 EAB。较长的有效期意味着续期频率更低,适合对自动化链路稳定性要求高、但又不希望频繁触发签发的场景。不过其根证书在部分老旧客户端中可能未被预置,部署前应确认目标客户端的信任库版本。

私有 ACME 服务端的接入与价值

step-ca 是 Smallstep 推出的私有 CA,内置 ACME 服务端。启动后其 ACME 目录通常形如 https://ca.internal:9000/acme/acme/directory。接入前需要先初始化 CA 并将根证书分发到所有需要信任该 CA 的客户端。step-ca 支持签发内网域名(如 *.svc.cluster.local),并可配置极短的有效期(例如 24 小时),配合自动续期实现“证书即短期凭证”的安全模型。

Pebble 是 Let's Encrypt 官方提供的轻量级 ACME 测试服务端,目录地址默认为 https://localhost:14000/dir。它不签发受信任证书,专用于验证 ACME 客户端行为、CI 流水线中的协议兼容性测试。使用 Pebble 时通常需要设置环境变量跳过 TLS 校验,因为它使用自签证书:

# 启动 Pebble(示例)
pebble -config ./test/config/pebble-config.json

# 客户端指向 Pebble
acme.sh --issue --server https://localhost:14000/dir \
  --domain test.example.com --webroot /var/www/html \
  --insecure

选型与接入决策

选择哪个服务端,取决于证书的使用场景。面向公网用户的服务必须使用公共 CA,以保证浏览器信任;内网服务、服务网格、设备身份则优先考虑 step-ca,以获得内网域名支持和更短的证书生命周期。Pebble 只应出现在测试环境,绝不能用于生产签发。ZeroSSL 和 Buypass 可作为 Let's Encrypt 的冗余备份,在客户端中配置多个 CA 并设置故障切换,能显著提升自动化链路的可用性。

接入任何 ACME 服务端前,先用 curl 访问其目录 URL,确认返回 JSON 中包含 newAccount、newOrder 等端点,再配置客户端。这一步能快速排除网络策略或 URL 错误导致的问题。
私有 ACME 服务端的根证书必须提前分发到所有客户端信任库,否则即使证书签发成功,客户端仍会报“未知颁发者”。根证书轮换时需同步更新信任库,建议将根证书纳入配置管理统一推送。