3. ACME 协议与 Let's Encrypt:自动化的心脏

聊到证书自动续签,有两个东西绕不开:ACME 协议和 Let's Encrypt。说白了,ACME 就是自动化续签的「通信语言」,而 Let's Encrypt 是目前最主流的「证书签发商」。我最早接触这俩是在一个物联网项目里,当时要管理上百台边缘网关的证书,手动续签简直要命。嗯,从那以后我就彻底倒向 ACME 了。

3.1 ACME 协议工作流程

ACME 全称是 Automated Certificate Management Environment。它的核心思想很简单:让客户端自动证明自己对域名的控制权,然后向 CA 申请证书。整个过程分四步走。

ACME 核心流程(四步走)

  1. 客户端发起申请:客户端生成密钥对,向 CA 注册账号并请求签发证书。
  2. CA 下发挑战:CA 要求客户端证明域名所有权,常见挑战类型有 HTTP-01、DNS-01、TLS-ALPN-01。
  3. 客户端完成挑战:客户端在指定位置放置 token 或修改 DNS 记录,CA 验证通过后即确认控制权。
  4. CA 签发证书:验证通过后,CA 将证书颁发给客户端,客户端保存证书和私钥。

我在项目中用得最多的是 HTTP-01 和 DNS-01。HTTP-01 适合 80 端口可用的场景,而 DNS-01 适合无法直接暴露端口的边缘网关。你想想看,边缘网关往往在 NAT 后面,HTTP-01 根本走不通,这时候 DNS-01 就是救命稻草。

我的习惯:对于边缘网关,我建议优先用 DNS-01 挑战。虽然需要配置 DNS API 密钥,但一次配置好就能全自动续签,省心很多。

3.2 Let's Encrypt 介绍

Let's Encrypt 是一个免费、自动化的 CA。它由互联网安全研究小组(ISRG)运营,目标是让 HTTPS 普及化。我个人觉得,它是过去十年互联网安全领域最伟大的项目之一。

Let's Encrypt 的几个关键特点:

  • 免费:完全零成本,任何人都可以申请。
  • 自动化:通过 ACME 协议实现全自动签发和续签。
  • 短期证书:证书有效期 90 天,强制自动化续签。
  • 广泛信任:根证书被所有主流操作系统和浏览器信任。

我记得刚开始用 Let's Encrypt 时,很多人担心 90 天有效期太短。但实际用下来你会发现,这反而是个优点——逼着你把自动化做好,避免证书过期导致服务中断。

注意:Let's Encrypt 证书有效期固定为 90 天,不支持自定义。如果你的业务需要更长有效期,可以考虑商业 CA 或自建 PKI。

3.3 Rate Limits 与 Staging 环境

Let's Encrypt 虽然是免费的,但也不是无限制的。为了保护服务稳定性,它设置了一些 Rate Limits(速率限制)。我在项目初期就踩过这个坑,当时批量申请证书,结果被限流了,整个部署流程卡住。

常见的 Rate Limits 如下:

限制项 限制值 说明
证书数/域名/周 50 每个域名每周最多签发 50 张证书
重复证书/域名/周 5 相同域名组合每周最多签发 5 张
失败验证/域名/小时 5 验证失败超过 5 次,需等待 1 小时
注册账号/IP/3小时 10 每个 IP 每 3 小时最多注册 10 个账号

为了避免在生产环境踩雷,Let's Encrypt 提供了 Staging 环境。Staging 环境的 Rate Limits 宽松很多,而且签发的证书不会被浏览器信任,适合用来测试和调试。

Staging 环境地址:https://acme-staging-v02.api.letsencrypt.org/directory

生产环境地址:https://acme-v02.api.letsencrypt.org/directory

我曾经在 Staging 环境上调试 ACME 客户端配置,确认无误后再切换到生产环境。这个习惯帮我避免了好几次生产事故。你想想看,如果直接在线上跑 ACME 流程,万一 Rate Limits 触发,整个续签流程就断了。

避坑指南:我建议所有 ACME 客户端配置都先在 Staging 环境跑通,确认挑战类型、DNS 解析、端口可达性都没问题后,再切换到生产环境。尤其是 DNS-01 挑战,API 密钥配置容易出错,Staging 环境能帮你提前发现这些问题。

3.4 ACME 协议工作流程 SVG 图

下面这张图展示了 ACME 协议从客户端发起申请到 CA 签发证书的完整流程。我把它画出来,方便你理解每一步的交互关系。

ACME 协议工作流程 ACME 协议工作流程 客户端 CA 服务器 ① 发起证书申请 ② 下发挑战(HTTP-01/DNS-01) 完成挑战验证 ③ 验证通过 ④ 签发证书 保存证书与私钥 挑战类型 HTTP-01:80 端口 DNS-01:DNS 记录

3.5 实战建议:如何选择挑战类型

根据我的经验,不同场景适合不同的挑战类型。下面这个表格帮你快速决策:

挑战类型 适用场景 优点 缺点
HTTP-01 80 端口可访问的服务器 配置简单,无需 API 密钥 需要开放 80 端口,不支持 NAT 环境
DNS-01 边缘网关、NAT 环境、泛域名 无需开放端口,支持泛域名 需要 DNS API 密钥,配置稍复杂
TLS-ALPN-01 443 端口可访问的服务器 无需额外端口,安全性高 需要支持 ALPN 的 TLS 实现

我个人在边缘网关项目里几乎只用 DNS-01。虽然第一次配置 DNS API 密钥有点麻烦,但一旦配好,后续续签完全自动化,再也不用操心端口开放的问题。

重要提醒:DNS-01 挑战需要 DNS API 密钥,这个密钥权限很大(可以修改 DNS 记录)。务必妥善保管,建议使用最小权限原则,只给 ACME 客户端需要的操作权限。

好了,这一章的内容就到这里。ACME 协议和 Let's Encrypt 是证书自动续签的基石,理解它们的工作原理,后续的实战操作才能游刃有余。