Let‘s Encrypt证书有效期缩短至90天后,如何实现自动续期
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 示例:
curl-o/usr/bin/letsencrypt-renew https://平台下载地址/letsencrypt-renewchmod+x /usr/bin/letsencrypt-renewcrontab-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/crontabcrontab/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=trueWindows + IIS 示例:
# 下载续期工具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:18AMRegister-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:
# Ubuntu/Debiansudoaptupdatesudoaptinstallcertbot# CentOS/RHELsudoyuminstallcertbot- 申请证书。有两种模式可选,各有局限:
standalone 模式:certbot 自己启动一个临时Web服务器监听80端口,申请和续期时必须临时停止 Nginx/Apache 等Web服务,线上环境会造成短暂中断:
# 如果 Nginx 正在运行,先停止sudosystemctl stop nginx# 申请证书sudocertbot certonly--standalone-dexample.com-dwww.example.com# 重新启动 Nginxsudosystemctl start nginxwebroot 模式:不需要停止服务,但需要确保 certbot 写入验证文件的目录能被 Nginx 正确代理,且 Let’s Encrypt 能从公网访问到:
sudocertbot certonly--webroot-w/var/www/html-dexample.com-dwww.example.comwebroot 模式要求 Nginx 配置中允许外部访问/.well-known/acme-challenge/路径,如果你的 Nginx 有安全限制(如只允许特定IP访问),还需要额外放行:
# Nginx 中需要确保以下路径可被公网访问 location /.well-known/acme-challenge/ { root /var/www/html; }- 配置自动续期定时任务:
# 测试续期命令是否正常sudocertbot 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:
#!/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. 获取主域名的 ZoneIdZONE_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记录生效..."sleep30重要提示:上方脚本为简化示例,阿里云 API 需要严格的 HMAC-SHA1 签名认证,实际使用需要实现完整的签名逻辑(包括参数排序、URL编码、Base64编码等),代码量通常在100行以上。
清理 TXT 记录脚本certbot-dns-cleanup.sh:
#!/bin/bashACCESS_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/null2. 使用 hook 脚本申请泛域名证书
sudocertbot 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"\-dexample.com3. 配置自动续期
# 测试自动续期sudocertbot 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 证书》
