亚马逊AWS官方博客

应对TLS/SSL证书有效期大幅缩短——使用ACME协议实现证书自动续期

摘要:CA/Browser Forum 于2025年4月正式通过决议,将分阶段大幅缩短 SSL/TLS 证书的最大有效期。如果客户使用亚马逊云科技的ACM服务,则证书到期更新可以自动化进行,无需客户手动操作。但是依然有很多客户,出于各种原因,在云上自建应用,并且使用了第三方证书,那么 TLS 证书的管理和续期就是客户的责任。本文以在运行Nginx的EC2, Let’s Encrypt为例,演示如何实现证书自动续期的实战方案,其他商业证书也可以依据文中原理,类似处理。


一、引言

CA/Browser Forum 于2025年4月正式通过决议,将分阶段大幅缩短 SSL/TLS 证书的最大有效期。具体时间表为:2026年3月15日起从现行的398天缩短至200天,2027年3月起进一步缩至100天,2029年3月起最终缩至仅47天(31天覆盖大月 + 15天缓冲 + 1天冗余)。与此同时,域名验证信息的复用期限也将同步缩短至约10天。

缩短有效期的核心目的有三:一是确保证书中的身份信息始终与实际情况一致,提升可信度;二是缩小因证书被盗用或错误签发带来的风险窗口;三是倒逼行业全面推进自动化管理。当有效期降至47天后,每年至少需更新8次以上,手动操作将完全不可持续。因此,企业应尽早全面盘点现有证书资产,部署基于 ACME 协议的自动签发与续期体系,并建立到期监控与告警机制,必要时可委托专业服务商管理,以从容应对这一重大变革。

如果客户使用亚马逊云科技的ACM服务,则证书到期更新可以自动化进行,无需客户手动操作。但是依然有很多客户,出于各种原因,在云上自建应用,并且使用了第三方证书,那么 TLS 证书的管理和续期就是客户的责任。例如,Let’s Encrypt 证书每 90 天过期一次,DigiCert 等商业证书通常有效期为 1 年(最长 397 天)。无论哪种,手动续期都是随时可能引发故障的定时炸弹。

本文以在运行Nginx的EC2, Let’s Encrypt为例,以演示如何实现证书自动续期的实战方案,其他商业证书也可以依据文中原理,类似处理。所有内容均在 Amazon Linux 2023 EC2 实例上实测验证,使用 Nginx 1.28 和 Certbot 2.6。

二、前置条件

2.1 EC2 实例准备

  • Amazon Linux 2023(AL2、Ubuntu、RHEL 命令类似)
  • 已安装 Nginx 并正常提供服务
  • 域名已通过 DNS A 记录指向 EC2 实例的公网 IP
  • 安全组已放行 80(HTTP)和 443(HTTPS)端口的入站流量

2.2 安装 Nginx

# Amazon Linux 2023
sudo dnf install nginx -y
sudo systemctl enable nginx
sudo systemctl start nginx

2.3 安装 Certbot

# 通过 pip 安装
sudo pip3 install certbot certbot-nginx

# 或通过 dnf 安装(Amazon Linux 2023)
sudo dnf install certbot python3-certbot-nginx -y

2.4 基础 Nginx 配置

修改nginx/conf.d/yourdomain.conf

server {
    listen 80;
    server_name yourdomain.com;

    location / {
        root /usr/share/nginx/html;
        index index.html;
    }
}

验证配置:

sudo nginx -t
sudo systemctl reload nginx
curl http://yourdomain.com  # 应返回你的页面

三、第一部分:Let’s Encrypt + Certbot

3.1 初始准备

在选择续期模式之前,需要先获取第一张证书。任何模式都可以完成首次签发,真正重要的是续期时的配置方式。

3.2 模式一:Standalone — 简单但有短暂停机

工作原理: Certbot 在本地 80 端口启动一个临时 Web 服务器来处理 ACME HTTP-01 验证。由于 Nginx 已占用 80 端口,必须先停止 Nginx。

步骤 1:获取证书

# 停止 Nginx 以释放 80 端口
sudo systemctl stop nginx

# 申请证书
sudo certbot certonly --standalone -d yourdomain.com

# 重启 Nginx
sudo systemctl start nginx

步骤 2:配置 Nginx 启用 HTTPS

创建或更新 /etc/nginx/conf.d/yourdomain.conf

server {
    listen 80;
    server_name yourdomain.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    location / {
        root /usr/share/nginx/html;
        index index.html;
    }
}
sudo nginx -t && sudo systemctl reload nginx

步骤 3:设置带钩子的自动续期

# 测试续期(dry run 模拟运行)
sudo certbot renew --dry-run \
  --pre-hook "systemctl stop nginx" \
  --post-hook "systemctl start nginx"

续期配置保存在 /etc/letsencrypt/renewal/yourdomain.com.conf,首次成功运行后 Certbot 会自动记录钩子:

[renewalparams]
authenticator = standalone
pre_hook = systemctl stop nginx
post_hook = systemctl start nginx

优点:

  • 配置最简单 — 无需修改 Nginx 配置
  • 适用于任何 Web 服务器,不限于 Nginx

缺点:

  • ⚠️ 每次续期有 10–30 秒停机(Nginx 被停止)
  • 80 端口必须可用(不能有其他服务占用)

适用场景: 开发/测试环境、低流量站点、或可以接受短暂停机的场景。

3.3 模式二:Webroot — 零停机

工作原理: Certbot 将验证文件放到 Nginx 的 Web 根目录中,Nginx 直接提供该文件 — 无需重启。Let’s Encrypt 通过请求 http://yourdomain.com/.well-known/acme-challenge/<token> 来完成验证。

步骤 1:修改 Nginx 配置以支持 ACME 验证

⚠️ 注意:

如果你的 80 端口 server 块配置了全局 return 301 重定向到 HTTPS,ACME 验证请求也会被重定向 — 导致验证失败。

/etc/nginx/conf.d/yourdomain.conf 的重定向之前添加例外规则:

server {
    listen 80;
    server_name yourdomain.com;

    # 直接提供 ACME 验证文件(不重定向)
    location /.well-known/acme-challenge/ {
        root /usr/share/nginx/html;
    }

    # 其他请求重定向到 HTTPS
    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl;
    server_name yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    location / {
        root /usr/share/nginx/html;
        index index.html;
    }
}
sudo nginx -t && sudo systemctl reload nginx

步骤 2:验证 ACME 路径是否可访问

# 创建测试验证文件
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

# 测试 — 应返回 HTTP 200(而非 301)
curl -I http://yourdomain.com/.well-known/acme-challenge/test-token

# 清理
sudo rm /usr/share/nginx/html/.well-known/acme-challenge/test-token

如果看到 HTTP/1.1 200 OK,说明配置正确。如果看到 301 Moved Permanently,说明 ACME location 块没有生效 — 检查 Nginx 配置中的规则顺序。

步骤 3:获取证书

sudo certbot certonly --webroot \
  -w /usr/share/nginx/html \
  -d yourdomain.com

步骤 4:测试自动续期

sudo certbot renew --dry-run

续期配置(/etc/letsencrypt/renewal/yourdomain.com.conf)内容如下:

[renewalparams]
authenticator = webroot
webroot_path = /usr/share/nginx/html,

无需 pre/post 钩子 — Nginx 全程运行。

ℹ️ 提示:

添加 deploy 钩子,在续期成功后自动重载 Nginx 以加载新证书:

优点:

  • ✅ 零停机 — 续期期间 Nginx 持续提供服务
  • 适用于任何能提供静态文件的 Web 服务器

缺点:

  • 需要一次性修改 Nginx 配置(添加 ACME 验证 location 块)
  • Webroot 路径必须与 Nginx 的文档根目录一致

适用场景: 希望零停机同时保留 Nginx 配置完全控制权的生产环境。

3.4 模式三:Nginx 插件 — 零停机,全自动集成

工作原理: Certbot 直接与 Nginx 通信 — 临时修改 Nginx 配置来处理 ACME 验证,完成验证后安装新证书并重载 Nginx,全程自动。

步骤 1:安装 Nginx 插件

sudo pip3 install certbot-nginx
# 或
sudo dnf install python3-certbot-nginx -y

验证插件可用:

certbot plugins
# 应列出:nginx, standalone, webroot

步骤 2:获取并安装证书

sudo certbot --nginx -d yourdomain.com

这条命令一次完成:

  1. 通过 Nginx 处理 ACME 验证
  2. 下载证书
  3. 自动更新 Nginx 配置添加 SSL 指令
  4. 重载 Nginx

步骤 3:测试自动续期

sudo certbot renew --dry-run

续期配置显示:

[renewalparams]
authenticator = nginx
installer = nginx

无需钩子、无需修改配置、无需指定 webroot 路径。

优点:

  • ✅ 零停机
  • ✅ 无需手动修改 Nginx 配置 — Certbot 自动管理 SSL 指令
  • ✅ 后续维护最简单 — 一条命令搞定一切
  • 自动处理 ACME 验证路径

缺点:

  • Certbot 会修改你的 Nginx 配置文件(添加 ssl_certificatessl_certificate_key 等指令)— 如果你有复杂的自定义配置,建议检查修改内容
  • 需要安装 certbot-nginx 插件包

适用场景: 大多数生产环境的推荐方案,除非你有特殊原因需要手动管理 Nginx 配置。

3.5 三种模式对比

特性 Standalone Webroot Nginx 插件
续期时停机 ⚠️ 10–30 秒 ✅ 零 ✅ 零
需要停止 Nginx?
需要修改 Nginx 配置? 不需要 需要(ACME location 块) 不需要(自动管理)
自动配置 SSL
需要 pre/post 钩子?
复杂度 最低
适用场景 开发/测试 需要完全配置控制 大多数生产站点

3.6 配置自动续期(Cron/Systemd)

大多数系统上,Certbot 安装时会自动创建 systemd 定时器或 cron 任务。验证:

# 检查 systemd 定时器
sudo systemctl list-timers | grep certbot

# 或检查 cron
sudo cat /etc/cron.d/certbot 2>/dev/null

如果都不存在,手动创建 cron 任务:

# 每天运行两次(Certbot 仅在到期前 30 天内才会实际续期)
echo "0 3,15 * * * root certbot renew --quiet" | sudo tee /etc/cron.d/certbot

测试

sudo certbot renew --dry-run

应看到输出:The dry run was successful.

 

⚠️ 重要提示:

如果使用 Standalone 模式,确保续期配置包含 pre/post 钩子,或在 cron 命令中添加 –pre-hook 和 –post-hook。否则 Certbot 会因 80 端口被占用而失败。

四、第二部分:DigiCert 用户 — 在 EC2 上实现自动续期

DigiCert 是商业付费证书提供商,支持更强的验证选项(OV/EV)。虽然没有 Let’s Encrypt 的免费 ACME 基础设施,但自动化续期完全可以实现。

DigiCert 通过 CertCentral 平台支持 ACME 协议。这意味着可以使用与 Let’s Encrypt 相同的 Certbot 客户端 — 只需指向 DigiCert 的 ACME 服务器。

前置条件

  • DigiCert CertCentral 账户
  • 从 CertCentral 获取 ACME 目录 URL(Settings → ACME Directory URLs)
  • 外部账户绑定(EAB)密钥对:KID + HMAC Key(从 CertCentral 获取)

步骤 1:向 DigiCert ACME 服务器注册

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

步骤 2:获取证书(三种模式均可)

Standalone

sudo certbot certonly --standalone \
  --server "https://acme.digicert.com/v2/acme/directory/" \
  -d yourdomain.com \
  --pre-hook "systemctl stop nginx" \
  --post-hook "systemctl start nginx"

Webroot

sudo certbot certonly --webroot \
  --server "https://acme.digicert.com/v2/acme/directory/" \
  -w /usr/share/nginx/html \
  -d yourdomain.com

Nginx 插件

sudo certbot --nginx \
  --server "https://acme.digicert.com/v2/acme/directory/" \
  -d yourdomain.com

步骤 3:自动续期方式完全相同

sudo certbot renew --dry-run

Certbot 会在续期配置中保存 ACME 服务器 URL,certbot renew 会自动与 DigiCert 服务器通信。

ℹ️ 注意:

DigiCert ACME 支持 HTTP-01 和 DNS-01 验证。Webroot 模式的 Nginx 配置要求(ACME location 块等)同样适用。

五、总结

本文针对 SSL/TLS 证书有效期即将大幅缩短的趋势,提供了在 亚马逊云科技 EC2 + Nginx 环境下实现证书自动续期的完整方案,且基于Let’s Encrypt证书介绍了 Certbot 的三种模式:Standalone(最简单但有短暂停机)、Webroot(零停机,需手动配置 ACME 路径)、Nginx 插件(零停机且全自动,推荐大多数生产环境使用),并说明了如何通过 Cron 或 Systemd 定时器实现自动续期。随着2029年证书有效期缩至47天,自动化管理已从可选变为必选,企业应根据自身架构和预算尽早落地。

➡️ 下一步行动:

相关产品:

  • Amazon EC2 — 安全且可调整大小的计算容量

相关文章:

*前述特定亚马逊云科技生成式人工智能相关的服务目前在亚马逊云科技海外区域可用。亚马逊云科技中国区域相关云服务由西云数据和光环新网运营,具体信息以中国区域官网为准。

本篇作者

宋孜攀

亚马逊云科技解决方案架构师,拥有多年软件研发及云计算咨询经验,负责基于亚马逊云科技的云计算方案的架构设计,同时致力于亚马逊云科技在移动应用与互联网行业的应用和推广。

汪仁君

伟仕佳杰-云计算事业部-高级工程师,拥有 20+ 年的 IT 从业经验。致力于云计算产品解决方案在企业中的推广和应用、云端架构方案制定、方案讲解演示、现场答疑、项目 POC、落地实施、交付和维护。


AWS 架构师中心:云端创新的引领者

探索 AWS 架构师中心,获取经实战验证的最佳实践与架构指南,助您高效构建安全、可靠的云上应用