3. ACME 协议与 Let's Encrypt:自动化的心脏
聊到证书自动续签,有两个东西绕不开:ACME 协议和 Let's Encrypt。说白了,ACME 就是自动化续签的「通信语言」,而 Let's Encrypt 是目前最主流的「证书签发商」。我最早接触这俩是在一个物联网项目里,当时要管理上百台边缘网关的证书,手动续签简直要命。嗯,从那以后我就彻底倒向 ACME 了。
3.1 ACME 协议工作流程
ACME 全称是 Automated Certificate Management Environment。它的核心思想很简单:让客户端自动证明自己对域名的控制权,然后向 CA 申请证书。整个过程分四步走。
ACME 核心流程(四步走)
- 客户端发起申请:客户端生成密钥对,向 CA 注册账号并请求签发证书。
- CA 下发挑战:CA 要求客户端证明域名所有权,常见挑战类型有 HTTP-01、DNS-01、TLS-ALPN-01。
- 客户端完成挑战:客户端在指定位置放置 token 或修改 DNS 记录,CA 验证通过后即确认控制权。
- 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 签发证书的完整流程。我把它画出来,方便你理解每一步的交互关系。
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 是证书自动续签的基石,理解它们的工作原理,后续的实战操作才能游刃有余。