Let‘s Encrypt证书有效期缩短至90天后,如何实现自动续期

Let's Encrypt证书有效期缩短至90天后,如何实现自动续期

打开网站突然发现浏览器地址栏一把红色小锁,提示"您的连接不是专用连接"------SSL证书过期了。这可能是站长最不想看到的画面之一:用户无法正常访问、搜索引擎排名下降、甚至被浏览器直接拦截。

更糟的是,从2024年起免费SSL证书有效期已统一缩短为3个月,意味着每年至少要手动续期4次。如果管理多个域名,忘记续期几乎是迟早的事。

解决方案只有一个:自动续期。 本文对比3种主流的SSL证书自动续期方案,帮你找到最适合自己的方式。

一、3种方案速览

方案 操作难度 泛域名自动续期 是否需要写脚本 是否收费
第三方证书管理平台 不需要 免费
Let's Encrypt + Certbot 需自写hook脚本 必须 免费
云厂商证书自动续期 不需要 收费

下面逐一详解。

二、方案一:第三方证书管理平台

除了 Let's Encrypt 官方工具和云厂商服务,市面上还有一些第三方证书管理平台(如乐此云签等),提供从证书申请到自动续期的一站式图形化操作。证书申请在浏览器里点几下即可完成,自动续期则通过平台生成的一键部署命令,复制到服务器上执行一次即可永久生效。

证书申请

如果证书还未申请,先在对应平台完成申请:

  1. 登录平台控制台(如 letsssl.cn),点击 "申请证书"

  2. 填写域名信息:单域名直接输入域名,泛域名勾选 "泛域名,包含根域" 即可一张证书覆盖 *.example.com + example.com

  3. 按照平台提示完成 DNS 域名验证(支持 CNAME 验证,比传统 TXT 验证更方便),验证通过后证书自动签发,下载对应服务器格式的证书文件部署到服务器即可

自动续期配置

证书申请完成后,接下来配置自动续期,确保证书到期前自动更新:

  1. 在证书列表中找到需要自动续期的证书,点击 "自动续期"

  2. 填写服务器信息(证书路径、密钥路径、服务器类型、重启命令等),平台会自动生成一键部署脚本:

具体参数说明:

  • 证书路径 :证书文件在服务器上的存放路径,如 /data/nginx/ssl/example.com.crt
  • 密钥路径 :私钥文件在服务器上的存放路径,如 /data/nginx/ssl/example.com.key
  • 服务器类型:选择 Nginx / Apache / Tomcat / IIS 等
  • 重启命令 :证书更新后重载服务的命令,如 docker exec nginx nginx -s reloadsystemctl reload nginx
  1. 点击生成,平台自动生成专属部署脚本,完整命令类似:

Linux + Nginx 示例

bash 复制代码
curl -o /usr/bin/letsencrypt-renew https://平台下载地址/letsencrypt-renew
chmod +x /usr/bin/letsencrypt-renew
crontab -l > /etc/crontab && echo '18 4 10,25 * * root /usr/bin/letsencrypt-renew -token=你的Token -key_path=/data/nginx/ssl/example.com.key -server_type=nginx -cert_path=/data/nginx/ssl/example.com.cert -command="docker exec nginx nginx -s reload" -backup=true ' >> /etc/crontab
crontab /etc/crontab
/usr/bin/letsencrypt-renew -token=你的Token -key_path=/data/nginx/ssl/example.com.key -server_type=nginx -cert_path=/data/nginx/ssl/example.com.cert -command="docker exec nginx nginx -s reload" -backup=true

Windows + IIS 示例

powershell 复制代码
# 下载续期工具
Invoke-WebRequest -Uri "https://平台下载地址/letsencrypt-renew.exe" -OutFile "C:\letsencrypt-renew.exe"

# 创建Windows计划任务(每月10日和25日凌晨4:18执行)
$action = New-ScheduledTaskAction -Execute "C:\letsencrypt-renew.exe" -Argument "-token=你的Token -cert_path=C:\ssl\example.com.pfx -server_type=iis -site_name=你的站点名 -backup=true"
$trigger = New-ScheduledTaskTrigger -Monthly -DaysOfMonth 10,25 -At 4:18AM
Register-ScheduledTask -TaskName "SSLAutoRenew" -Action $action -Trigger $trigger -RunLevel Highest

# 立即执行一次
C:\letsencrypt-renew.exe -token=你的Token -cert_path=C:\ssl\example.com.pfx -server_type=iis -site_name=你的站点名 -backup=true
  1. 将命令复制到服务器终端执行一次即可,后续全自动运行

运行机制

脚本执行后会自动创建定时任务(Linux 为 cron,Windows 为计划任务),每15天检查一次证书状态,到期前自动完成续期并重载服务。同时支持证书备份,续期前自动备份旧证书,防止异常情况导致服务中断。

优势

  • 图形化配置:所有参数在浏览器界面填写,不需要编辑配置文件或写脚本
  • 支持泛域名自动续期:单域名和泛域名证书均可全自动续期
  • 一键部署:生成命令复制到服务器执行一次即可,无需反复配置

不足

  • 依赖第三方平台:续期脚本需要连接平台服务器获取新证书,平台服务中断会影响续期
  • 服务器需访问外网:续期脚本需要从平台下载新证书,内网环境无法使用
  • Token 安全风险:服务器上保存的 Token 泄露后他人可获取你的证书

三、方案二:Let's Encrypt + Certbot

Certbot 是 Let's Encrypt 官方推荐的客户端工具。很多人以为单域名证书只要一条 certbot renew 就能自动续期,但实际情况并没有那么简单------无论是单域名还是泛域名,自动续期都有不小的配置门槛,只是难点不同。

单域名证书自动续期

单域名证书使用 HTTP-01 验证方式,原理是 Let's Encrypt 会从公网访问你服务器的80端口,读取一个验证文件来确认域名所有权。这意味着你的服务器80端口必须对外开放,且 Let's Encrypt 能够从公网正常访问到验证路径------这在很多实际场景中并不容易满足:

  • 服务器在内网,没有公网IP(如企业内网、NAT后面)→ HTTP-01 验证无法完成
  • 80端口被防火墙/安全组拦截 → 需要额外开放端口
  • 使用CDN或反向代理 → 验证请求可能无法到达源站
  • 使用Docker/K8s容器化部署 → 端口映射和路径挂载需要额外处理

如果以上条件都满足,配置流程如下:

  1. 安装 certbot:
bash 复制代码
# Ubuntu/Debian
sudo apt update
sudo apt install certbot

# CentOS/RHEL
sudo yum install certbot
  1. 申请证书。有两种模式可选,各有局限:

standalone 模式 :certbot 自己启动一个临时Web服务器监听80端口,申请和续期时必须临时停止 Nginx/Apache 等Web服务,线上环境会造成短暂中断:

bash 复制代码
# 如果 Nginx 正在运行,先停止
sudo systemctl stop nginx

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

# 重新启动 Nginx
sudo systemctl start nginx

webroot 模式:不需要停止服务,但需要确保 certbot 写入验证文件的目录能被 Nginx 正确代理,且 Let's Encrypt 能从公网访问到:

bash 复制代码
sudo certbot certonly --webroot -w /var/www/html -d example.com -d www.example.com

webroot 模式要求 Nginx 配置中允许外部访问 /.well-known/acme-challenge/ 路径,如果你的 Nginx 有安全限制(如只允许特定IP访问),还需要额外放行:

nginx 复制代码
# Nginx 中需要确保以下路径可被公网访问
location /.well-known/acme-challenge/ {
    root /var/www/html;
}
  1. 配置自动续期定时任务:
bash 复制代码
# 测试续期命令是否正常
sudo certbot renew --dry-run

# 添加 cron 定时任务,每天凌晨2:30检查续期
echo '30 2 * * * root certbot renew --quiet --deploy-hook "systemctl reload nginx"' >> /etc/crontab

可以看到,即便是"最简单"的单域名自动续期,也需要确保80端口公网可达、正确配置验证路径、处理Web服务中断(standalone模式)或Nginx路径放行(webroot模式),并不是一条命令就能搞定的。

泛域名证书自动续期(高难度)

泛域名证书必须使用 DNS-01 验证,而 certbot 在 --manual 模式下每次都需要手动添加 DNS TXT 记录,无法自动续期。要实现泛域名自动续期,必须自行编写一个 hook 脚本,通过 API 调用域名服务商的接口来自动添加和删除 TXT 记录。

以下是完整的配置流程:

1. 编写 DNS 验证 hook 脚本

以阿里云 DNS 为例,需要编写两个脚本:一个用于添加 TXT 记录,一个用于清理 TXT 记录。

添加 TXT 记录脚本 certbot-dns-auth.sh

bash 复制代码
#!/bin/bash

# 阿里云 DNS API 配置
ACCESS_KEY_ID="你的AccessKeyId"
ACCESS_KEY_SECRET="你的AccessKeySecret"
DOMAIN="example.com"

# 解析域名参数
FULl_DOMAIN_NAME="_acme-challenge.${CERTBOT_DOMAIN}"
VALIDATION="${CERTBOT_VALIDATION}"

# 获取域名解析记录ID(需要调用阿里云API)
# 注意:以下为简化示例,实际使用需要实现完整的阿里云API签名

# 1. 获取主域名的 ZoneId
ZONE_ID=$(curl -s "https://alidns.aliyuncs.com/" \
  --data-urlencode "Action=DescribeDomains" \
  --data-urlencode "DomainName=${DOMAIN}" \
  --data-urlencode "AccessKeyId=${ACCESS_KEY_ID}" \
  --data-urlencode "SignatureMethod=HMAC-SHA1" \
  --data-urlencode "SignatureVersion=1.0" \
  --data-urlencode "SignatureNonce=$(uuidgen)" \
  --data-urlencode "Timestamp=$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
  --data-urlencode "Version=2015-01-09" \
  | python3 -c "import sys,json; print(json.load(sys.stdin)['DomainList']['Domain'][0]['DomainId'])")

# 2. 添加 TXT 记录
curl -s "https://alidns.aliyuncs.com/" \
  --data-urlencode "Action=AddDomainRecord" \
  --data-urlencode "DomainName=${DOMAIN}" \
  --data-urlencode "RR=_acme-challenge" \
  --data-urlencode "Type=TXT" \
  --data-urlencode "Value=${VALIDATION}" \
  --data-urlencode "AccessKeyId=${ACCESS_KEY_ID}" \
  --data-urlencode "SignatureMethod=HMAC-SHA1" \
  --data-urlencode "SignatureVersion=1.0" \
  --data-urlencode "SignatureNonce=$(uuidgen)" \
  --data-urlencode "Timestamp=$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
  --data-urlencode "Version=2015-01-09" > /dev/null

# 3. 等待 DNS 记录生效
echo "等待DNS记录生效..."
sleep 30

重要提示:上方脚本为简化示例,阿里云 API 需要严格的 HMAC-SHA1 签名认证,实际使用需要实现完整的签名逻辑(包括参数排序、URL编码、Base64编码等),代码量通常在100行以上。

清理 TXT 记录脚本 certbot-dns-cleanup.sh

bash 复制代码
#!/bin/bash

ACCESS_KEY_ID="你的AccessKeyId"
ACCESS_KEY_SECRET="你的AccessKeySecret"
DOMAIN="example.com"

# 查询并删除之前添加的 TXT 记录
# 同样需要完整的阿里云API签名逻辑
RECORD_ID=$(curl -s "https://alidns.aliyuncs.com/" \
  --data-urlencode "Action=DescribeSubDomainRecords" \
  --data-urlencode "SubDomain=_acme-challenge.${CERTBOT_DOMAIN}" \
  --data-urlencode "Type=TXT" \
  --data-urlencode "AccessKeyId=${ACCESS_KEY_ID}" \
  | python3 -c "import sys,json; print(json.load(sys.stdin)['DomainRecords']['Record'][0]['RecordId'])")

curl -s "https://alidns.aliyuncs.com/" \
  --data-urlencode "Action=DeleteDomainRecord" \
  --data-urlencode "RecordId=${RECORD_ID}" \
  --data-urlencode "AccessKeyId=${ACCESS_KEY_ID}" \
  > /dev/null
2. 使用 hook 脚本申请泛域名证书
bash 复制代码
sudo certbot certonly --manual \
  --preferred-challenges=dns \
  --manual-auth-hook /path/to/certbot-dns-auth.sh \
  --manual-cleanup-hook /path/to/certbot-dns-cleanup.sh \
  -d "*.example.com" \
  -d example.com
3. 配置自动续期
bash 复制代码
# 测试自动续期
sudo certbot renew --dry-run

# 添加定时任务
echo '30 2 * * * root certbot renew --quiet --deploy-hook "systemctl reload nginx"' >> /etc/crontab
不同DNS服务商的差异

每家DNS服务商的API接口都不同,以下列出主要服务商的情况:

DNS服务商 API复杂度 官方SDK 需要额外处理
阿里云DNS 有(Python/Java/Go) 需实现HMAC-SHA1签名,或使用官方SDK
腾讯云DNSPod 有(Python/Java/Go) 需实现TC3-HMAC-SHA256签名
Cloudflare API Token即可,签名简单
华为云DNS 需实现AK/SK签名
GoDaddy API Key + Secret,签名简单

提示:如果你觉得编写 hook 脚本太复杂,可以改用 certbot-dns-cloudflare 等官方插件,但目前仅支持 Cloudflare。国内DNS服务商没有官方插件,必须自行编写脚本。

优势

  • 官方工具:Let's Encrypt 官方维护,稳定可靠,文档丰富
  • 单域名续期成熟certbot renew 一行命令搞定,自动续期非常可靠
  • 社区活跃:遇到问题容易找到解决方案

不足

  • 泛域名续期配置极其复杂:需要自行编写 DNS API hook 脚本,涉及 API 签名认证、错误处理等,代码量通常在100行以上
  • 每家DNS服务商API不同:换一个DNS服务商就要重写一套脚本
  • API密钥安全风险:DNS 服务商的 API 密钥以明文形式存储在脚本和服务器上,一旦泄露攻击者可以篡改你的 DNS 解析
  • 需要命令行操作:全程终端操作,排错靠看日志
  • 占用80端口:standalone 模式需要临时停止 Web 服务

适合人群:熟悉 Linux 和 Shell 脚本开发、仅需单域名自动续期的用户。如果你需要泛域名自动续期且不愿意折腾脚本,这个方案会让你非常痛苦。

四、方案三:云厂商证书自动续期

主流云厂商也提供了SSL证书管理服务,部分支持自动续期功能,但大多需要购买付费服务。

各云厂商自动续期支持情况

云厂商 免费证书自动续期 付费证书自动续期 泛域名支持 年额度 费用
阿里云 ✓(需购买证书部署服务) 20张 约 ¥600/年起
腾讯云 ✓(需购买证书管理服务) 20张 约 ¥500/年起
华为云 ✓(需购买SSL证书管理服务) 20张 约 ¥600/年起
AWS ✓(ACM免费证书) 无限制 仅限AWS资源使用

注意 :阿里云、腾讯云、华为云的免费个人测试证书均不支持自动续期,要使用自动续期功能需要购买付费的证书管理/部署服务。AWS Certificate Manager(ACM)提供免费证书且支持自动续期,但证书只能绑定到AWS自家服务(ELB、CloudFront等),无法导出使用。

以阿里云为例

  1. 登录阿里云控制台,进入 SSL证书证书部署 服务
  2. 购买证书部署服务(收费)
  3. 配置部署任务:选择证书、目标服务器/负载均衡、部署方式
  4. 开启自动续期和自动部署

优势

  • 图形化操作:在云平台控制台完成配置
  • 与云产品集成:证书可以直接部署到云服务器、负载均衡、CDN等
  • 运维托管:续期和部署由云厂商负责

不足

  • 需要收费:自动续期功能需要购买付费服务,年费通常在 ¥500-600 起
  • 不支持泛域名:免费证书和付费DV证书均不支持泛域名,每个子域名需要单独一张证书
  • 年额度有限:免费证书仅20张/年,域名多了不够用
  • 绑死云平台:证书续期和部署只能在对应云平台内使用
  • 仅限云内资源:证书通常只能部署到该云厂商的产品上,跨平台使用受限

适合人群:已在阿里云/腾讯云/华为云上部署服务、预算充裕、域名数量少且不需要泛域名的企业用户。

五、3种方案详细对比

核心指标对比

对比项 第三方平台 Certbot 云厂商
费用 免费 免费 收费(¥500+/年)
单域名自动续期 ✓(付费)
泛域名自动续期 需自写hook脚本
图形化配置
需要编写脚本 不需要 泛域名必须 不需要
第三方依赖 依赖平台服务 绑定云平台
年额度限制 无限制 无限制 20张
配置耗时 5分钟 单域名10分钟 / 泛域名1小时+ 10分钟+购买流程
跨平台支持 Linux + Windows 主要Linux 仅限对应云平台
证书导出 部分支持

配置复杂度对比

以配置泛域名证书自动续期为例,三种方案的操作步骤对比:

步骤 第三方平台 Certbot 云厂商
1 浏览器中填写证书路径、密钥路径 安装 certbot 购买证书部署服务
2 填写服务重启命令 编写 DNS API 认证脚本(100+行) 配置部署任务
3 复制生成的一键命令到服务器 编写 TXT 记录添加脚本 开启自动续期
4 执行命令,完成 编写 TXT 记录清理脚本 ---
5 --- 配置 certbot 手动 hook 参数 ---
6 --- 测试自动续期流程 ---
7 --- 配置 cron 定时任务 ---

六、常见问题

Q1:SSL证书过期了,紧急恢复怎么做?

第一步:立即重新申请或续期证书。如果使用第三方平台,登录后在证书列表点击续期,几分钟即可完成。

第二步:将新证书部署到服务器,替换过期的证书文件。

第三步 :重载 Web 服务(如 nginx -s reload),新证书即可生效。

第四步:配置自动续期,避免再次过期。这才是长久之计------手动续期终究会遗忘。

Q2:证书还有多久过期就该续期?

Let's Encrypt 证书建议在到期前30天内续期。第三方平台的自动续期脚本通常每15天检查一次,到期前会自动触发续期。Certbot 的 certbot renew 命令也会在证书到期前30天内自动续期。

Q3:自动续期失败了怎么办?

  • 第三方平台:脚本会在续期前自动备份旧证书,即使续期失败,旧证书仍有效直到过期,你可以在修复问题后手动触发续期
  • Certbot :检查 cron 日志(/var/log/letsencrypt/letsencrypt.log),常见失败原因是 DNS API 调用失败或 80 端口被占用
  • 云厂商:联系云厂商技术支持

Q4:泛域名证书为什么比单域名证书续期复杂?

泛域名证书必须通过 DNS-01 验证来证明域名所有权,即需要在 DNS 中添加一条 _acme-challenge 的 TXT 记录。单域名证书可以用 HTTP-01 验证(在网站根目录放一个验证文件),certbot 可以自动完成。但 DNS 记录的增删需要调用 DNS 服务商的 API,certbot 本身不支持国内 DNS 服务商的 API,所以需要自己写脚本来桥接。

Q5:多个域名能用同一个自动续期方案吗?

  • 第三方平台:每个证书独立生成续期命令,但可以部署在同一台服务器上,互不影响
  • Certbotcertbot renew 一次性检查本机所有证书,但泛域名证书每个域名的 DNS hook 脚本可能不同
  • 云厂商:每张证书需要单独配置,且受20张年额度限制

七、总结

方案 核心取舍
第三方平台 配置简单,泛域名+自动续期,但依赖第三方服务
Certbot 单域名续期成熟,但泛域名需自写DNS脚本,门槛高
云厂商 托管省心,但收费且不支持泛域名

如果你不想折腾脚本和API签名,第三方平台的自动续期上手最快,但需要接受对第三方服务的依赖。

如果你是命令行高手,Certbot 的单域名方案足够可靠,但泛域名场景下的 hook 脚本开发会让大多数人望而却步。

如果你预算充足且域名少,云厂商的付费服务可以考虑,但20张年额度和不支持泛域名是硬伤。

归根到底,自动续期方案的选择取决于你的技术能力、域名规模和对第三方服务的接受程度。三种方案各有利弊,没有银弹,选适合自己的就好。


相关阅读

  • 《2026年免费SSL证书申请全攻略:5种方案对比》
  • 《申请SSL证书,如何完成域名验证》
  • 《Nginx/Tengine 服务器配置 SSL 证书》
  • 《Apache 服务器安装配置 SSL 证书》
相关推荐
Shingmc33 小时前
【Linux】应用层协议HTTP
网络·网络协议·http
wangl_924 小时前
Modbus RTU 与 Modbus TCP 深入指南-串口服务器:RTU转TCP
服务器·网络·网络协议·tcp/ip·tcp·modbus·rtu
七七powerful4 小时前
AI+运维提效,ssl-cert-monitoring(SSL证书监控系统)2.0开发完毕
运维·网络协议·ssl
CDN3604 小时前
告别TCP队头阻塞!HTTP/3与QUIC协议在2026年的实战落地
网络协议·tcp/ip·http
原来是猿4 小时前
JSON 序列化与反序列化 —— 用 Jsoncpp 打造自己的网络协议
网络·网络协议·json
身如柳絮随风扬5 小时前
RPC 深度解析:从原理到实践,一篇讲透远程过程调用
网络协议·rpc
七七powerful6 小时前
AI+运维提效,ssl-cert-monitoring(SSL证书监控系统)2.0修复bug及新增功能说明
运维·服务器·ssl
庞轩px6 小时前
第三篇:SpringMVC——一个HTTP请求在Spring中经历了什么?
网络协议·spring·http·springmvc·handlermapping·前端控制器
静心观复1 天前
从短连接到 gRPC:一文读懂 HTTP 连接模型的演进
网络·网络协议·http