深入理解 ACME 协议:在 Amazon EC2 + Nginx 环境下实现 TLS 证书全生命周期自动化
引言
CA/Browser Forum 于 2025 年 4 月通过了一项影响深远的决议:SSL/TLS 证书有效期将分阶段大幅缩短。2026 年 3 月起降至 200 天,2027 年 3 月降至 100 天,2029 年 3 月进一步缩至 47 天。域名验证信息复用期也将同步缩短到约 10 天。
这意味着手动管理证书续期将完全不可持续。本文基于亚马逊云科技 EC2 + Nginx 的实际环境,深入探讨 ACME 协议的工作机制以及 Certbot 三种续期模式的技术细节。
ACME 协议简述
ACME(Automatic Certificate Management Environment)是 IETF 标准协议(RFC 8555),定义了证书自动签发和管理的完整流程。核心验证方式包括:
- HTTP-01:在 Web 服务器上放置验证文件
- DNS-01:添加 TXT DNS 记录
- TLS-ALPN-01:通过 TLS 握手验证
Certbot 是使用范围较广的 ACME 客户端,支持 Let's Encrypt 和 DigiCert 等多个 CA。
环境准备
基础组件安装(Amazon Linux 2023):
sudo dnf install nginx -y
sudo systemctl enable nginx && sudo systemctl start nginx
sudo pip3 install certbot certbot-nginx
Nginx 配置验证:
sudo nginx -t
sudo systemctl reload nginx
三种 Certbot 模式的技术对比
Standalone 模式
Certbot 在本地 80 端口启动临时 HTTP 服务器响应 HTTP-01 challenge。需要先释放 80 端口:
sudo systemctl stop nginx
sudo certbot certonly --standalone -d yourdomain.com
sudo systemctl start nginx
自动续期需配置钩子:
sudo certbot renew --dry-run \
--pre-hook "systemctl stop nginx" \
--post-hook "systemctl start nginx"
钩子信息保存在 /etc/letsencrypt/renewal/yourdomain.com.conf 中。
Webroot 模式
Certbot 将验证文件写入 Nginx 文档根目录,Nginx 直接提供静态文件响应 challenge。
关键配置——在 301 重定向之前设置 ACME 路径例外:
server {
listen 80;
server_name yourdomain.com;
location /.well-known/acme-challenge/ {
root /usr/share/nginx/html;
}
location / {
return 301 https://$host$request_uri;
}
}
验证路径可达性:
sudo mkdir -p /usr/share/nginx/html/.well-known/acme-challenge
echo "test" | sudo tee /usr/share/nginx/html/.well-known/acme-challenge/test-token
curl -I http://yourdomain.com/.well-known/acme-challenge/test-token
# 期望返回 HTTP 200,而非 301
签发证书:
sudo certbot certonly --webroot -w /usr/share/nginx/html -d yourdomain.com
建议添加 deploy 钩子自动 reload:
#!/bin/bash
# /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
systemctl reload nginx
Nginx 插件模式
Certbot 直接与 Nginx 进程通信,临时修改配置处理 challenge,完成后自动安装证书和 SSL 指令并 reload:
sudo certbot --nginx -d yourdomain.com
续期配置中 authenticator = nginx, installer = nginx,无需额外钩子。
技术特性对比
| 维度 | Standalone | Webroot | Nginx 插件 |
|---|---|---|---|
| 验证方式 | Certbot 临时 HTTP 服务 | Nginx 提供静态文件 | Certbot 修改 Nginx 配置 |
| 续期停机 | 10-30 秒 | 零 | 零 |
| 侵入性 | 低 | 中(需加 location 块) | 中(自动修改 ssl 指令) |
| 适用范围 | 任意 Web 服务器 | 能提供静态文件的服务器 | 仅 Nginx |
定时续期配置
# 检查是否已有定时任务
sudo systemctl list-timers | grep certbot
# 手动创建 cron
echo "0 3,15 * * * root certbot renew --quiet" | sudo tee /etc/cron.d/certbot
Certbot 默认在证书到期前 30 天触发实际续期。每天运行两次确保不会错过窗口。
商业证书(DigiCert)的 ACME 集成
DigiCert CertCentral 支持 ACME 协议,通过外部账户绑定(EAB)认证:
# 注册
sudo certbot register \
--server "https://acme.digicert.com/v2/acme/directory/" \
--eab-kid "YOUR_EAB_KID" \
--eab-hmac-key "YOUR_EAB_HMAC_KEY" \
--email admin@yourdomain.com --agree-tos
# 获取证书(三种模式均可)
sudo certbot --nginx \
--server "https://acme.digicert.com/v2/acme/directory/" \
-d yourdomain.com
续期流程与 Let's Encrypt 一致,Certbot 在 renewal 配置中保存 ACME 服务器地址。
监控建议
- 用 CloudWatch 自定义指标监控证书到期时间
- 配置 SNS 告警:到期前 14 天通知
- 定期检查 Certbot 日志:
/var/log/letsencrypt/letsencrypt.log
总结
证书有效期缩短是大势所趋。亚马逊云科技用户的两个选择:
- 托管架构(ALB/CloudFront):ACM 自动续期,零配置
- 自建 Nginx:Certbot + ACME,推荐 Nginx 插件模式
所有操作在 Amazon Linux 2023 + Nginx 1.28 + Certbot 2.6 环境下实测验证。
参考:

浙公网安备 33010602011771号