深入理解 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 服务器地址。

监控建议

  1. 用 CloudWatch 自定义指标监控证书到期时间
  2. 配置 SNS 告警:到期前 14 天通知
  3. 定期检查 Certbot 日志:/var/log/letsencrypt/letsencrypt.log

总结

证书有效期缩短是大势所趋。亚马逊云科技用户的两个选择:

  • 托管架构(ALB/CloudFront):ACM 自动续期,零配置
  • 自建 Nginx:Certbot + ACME,推荐 Nginx 插件模式

所有操作在 Amazon Linux 2023 + Nginx 1.28 + Certbot 2.6 环境下实测验证。


参考:

posted @ 2026-04-23 08:34  亚马逊云开发者  阅读(13)  评论(0)    收藏  举报