Let's Encrypt证书有效期缩短至90天后,如何实现自动续期
打开网站突然发现浏览器地址栏一把红色小锁,提示"您的连接不是专用连接"------SSL证书过期了。这可能是站长最不想看到的画面之一:用户无法正常访问、搜索引擎排名下降、甚至被浏览器直接拦截。
更糟的是,从2024年起免费SSL证书有效期已统一缩短为3个月,意味着每年至少要手动续期4次。如果管理多个域名,忘记续期几乎是迟早的事。
解决方案只有一个:自动续期。 本文对比3种主流的SSL证书自动续期方案,帮你找到最适合自己的方式。
一、3种方案速览
| 方案 | 操作难度 | 泛域名自动续期 | 是否需要写脚本 | 是否收费 |
|---|---|---|---|---|
| 第三方证书管理平台 | 低 | ✓ | 不需要 | 免费 |
| Let's Encrypt + Certbot | 高 | 需自写hook脚本 | 必须 | 免费 |
| 云厂商证书自动续期 | 低 | ✗ | 不需要 | 收费 |
下面逐一详解。
二、方案一:第三方证书管理平台
除了 Let's Encrypt 官方工具和云厂商服务,市面上还有一些第三方证书管理平台(如乐此云签等),提供从证书申请到自动续期的一站式图形化操作。证书申请在浏览器里点几下即可完成,自动续期则通过平台生成的一键部署命令,复制到服务器上执行一次即可永久生效。
证书申请
如果证书还未申请,先在对应平台完成申请:
-
登录平台控制台(如 letsssl.cn),点击 "申请证书"
-
填写域名信息:单域名直接输入域名,泛域名勾选 "泛域名,包含根域" 即可一张证书覆盖
*.example.com+example.com
-
按照平台提示完成 DNS 域名验证(支持 CNAME 验证,比传统 TXT 验证更方便),验证通过后证书自动签发,下载对应服务器格式的证书文件部署到服务器即可
自动续期配置
证书申请完成后,接下来配置自动续期,确保证书到期前自动更新:
-
在证书列表中找到需要自动续期的证书,点击 "自动续期"
-
填写服务器信息(证书路径、密钥路径、服务器类型、重启命令等),平台会自动生成一键部署脚本:

具体参数说明:
- 证书路径 :证书文件在服务器上的存放路径,如
/data/nginx/ssl/example.com.crt - 密钥路径 :私钥文件在服务器上的存放路径,如
/data/nginx/ssl/example.com.key - 服务器类型:选择 Nginx / Apache / Tomcat / IIS 等
- 重启命令 :证书更新后重载服务的命令,如
docker exec nginx nginx -s reload或systemctl reload nginx
- 点击生成,平台自动生成专属部署脚本,完整命令类似:
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
- 将命令复制到服务器终端执行一次即可,后续全自动运行
运行机制
脚本执行后会自动创建定时任务(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容器化部署 → 端口映射和路径挂载需要额外处理
如果以上条件都满足,配置流程如下:
- 安装 certbot:
bash
# Ubuntu/Debian
sudo apt update
sudo apt install certbot
# CentOS/RHEL
sudo yum install certbot
- 申请证书。有两种模式可选,各有局限:
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;
}
- 配置自动续期定时任务:
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等),无法导出使用。
以阿里云为例
- 登录阿里云控制台,进入 SSL证书 → 证书部署 服务
- 购买证书部署服务(收费)
- 配置部署任务:选择证书、目标服务器/负载均衡、部署方式
- 开启自动续期和自动部署
优势
- 图形化操作:在云平台控制台完成配置
- 与云产品集成:证书可以直接部署到云服务器、负载均衡、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:多个域名能用同一个自动续期方案吗?
- 第三方平台:每个证书独立生成续期命令,但可以部署在同一台服务器上,互不影响
- Certbot :
certbot renew一次性检查本机所有证书,但泛域名证书每个域名的 DNS hook 脚本可能不同 - 云厂商:每张证书需要单独配置,且受20张年额度限制
七、总结
| 方案 | 核心取舍 |
|---|---|
| 第三方平台 | 配置简单,泛域名+自动续期,但依赖第三方服务 |
| Certbot | 单域名续期成熟,但泛域名需自写DNS脚本,门槛高 |
| 云厂商 | 托管省心,但收费且不支持泛域名 |
如果你不想折腾脚本和API签名,第三方平台的自动续期上手最快,但需要接受对第三方服务的依赖。
如果你是命令行高手,Certbot 的单域名方案足够可靠,但泛域名场景下的 hook 脚本开发会让大多数人望而却步。
如果你预算充足且域名少,云厂商的付费服务可以考虑,但20张年额度和不支持泛域名是硬伤。
归根到底,自动续期方案的选择取决于你的技术能力、域名规模和对第三方服务的接受程度。三种方案各有利弊,没有银弹,选适合自己的就好。
相关阅读:
- 《2026年免费SSL证书申请全攻略:5种方案对比》
- 《申请SSL证书,如何完成域名验证》
- 《Nginx/Tengine 服务器配置 SSL 证书》
- 《Apache 服务器安装配置 SSL 证书》