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.comexample.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-renewchmodx /usr/bin/letsencrypt-renewcrontab-l/etc/crontabecho18 4 10,25 * * root /usr/bin/letsencrypt-renew -token你的Token -key_path/data/nginx/ssl/example.com.key -server_typenginx -cert_path/data/nginx/ssl/example.com.cert -commanddocker exec nginx nginx -s reload -backuptrue /etc/crontabcrontab/etc/crontab /usr/bin/letsencrypt-renew-token你的Token-key_path/data/nginx/ssl/example.com.key-server_typenginx-cert_path/data/nginx/ssl/example.com.cert-commanddocker exec nginx nginx -s reload-backuptrueWindows IIS 示例# 下载续期工具Invoke-WebRequest-Urihttps://平台下载地址/letsencrypt-renew.exe-OutFileC:\letsencrypt-renew.exe# 创建Windows计划任务每月10日和25日凌晨4:18执行$actionNew-ScheduledTaskAction-ExecuteC:\letsencrypt-renew.exe-Argument-token你的Token -cert_pathC:\ssl\example.com.pfx -server_typeiis -site_name你的站点名 -backuptrue$triggerNew-ScheduledTaskTrigger-Monthly-DaysOfMonth 10,25-At 4:18AMRegister-ScheduledTask-TaskNameSSLAutoRenew-Action$action-Trigger$trigger-RunLevel Highest# 立即执行一次C:\letsencrypt-renew.exe-token你的Token-cert_pathC:\ssl\example.com.pfx-server_typeiis-site_name你的站点名-backuptrue将命令复制到服务器终端执行一次即可后续全自动运行运行机制脚本执行后会自动创建定时任务Linux 为 cronWindows 为计划任务每15天检查一次证书状态到期前自动完成续期并重载服务。同时支持证书备份续期前自动备份旧证书防止异常情况导致服务中断。优势图形化配置所有参数在浏览器界面填写不需要编辑配置文件或写脚本支持泛域名自动续期单域名和泛域名证书均可全自动续期一键部署生成命令复制到服务器执行一次即可无需反复配置不足依赖第三方平台续期脚本需要连接平台服务器获取新证书平台服务中断会影响续期服务器需访问外网续期脚本需要从平台下载新证书内网环境无法使用Token 安全风险服务器上保存的 Token 泄露后他人可获取你的证书三、方案二Let’s Encrypt CertbotCertbot 是 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检查续期echo30 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你的AccessKeyIdACCESS_KEY_SECRET你的AccessKeySecretDOMAINexample.com# 解析域名参数FULl_DOMAIN_NAME_acme-challenge.${CERTBOT_DOMAIN}VALIDATION${CERTBOT_VALIDATION}# 获取域名解析记录ID需要调用阿里云API# 注意以下为简化示例实际使用需要实现完整的阿里云API签名# 1. 获取主域名的 ZoneIdZONE_ID$(curl-shttps://alidns.aliyuncs.com/\--data-urlencodeActionDescribeDomains\--data-urlencodeDomainName${DOMAIN}\--data-urlencodeAccessKeyId${ACCESS_KEY_ID}\--data-urlencodeSignatureMethodHMAC-SHA1\--data-urlencodeSignatureVersion1.0\--data-urlencodeSignatureNonce$(uuidgen)\--data-urlencodeTimestamp$(date-u%Y-%m-%dT%H:%M:%SZ)\--data-urlencodeVersion2015-01-09\|python3-cimport sys,json;print(json.load(sys.stdin)[DomainList][Domain][0][DomainId]))# 2. 添加 TXT 记录curl-shttps://alidns.aliyuncs.com/\--data-urlencodeActionAddDomainRecord\--data-urlencodeDomainName${DOMAIN}\--data-urlencodeRR_acme-challenge\--data-urlencodeTypeTXT\--data-urlencodeValue${VALIDATION}\--data-urlencodeAccessKeyId${ACCESS_KEY_ID}\--data-urlencodeSignatureMethodHMAC-SHA1\--data-urlencodeSignatureVersion1.0\--data-urlencodeSignatureNonce$(uuidgen)\--data-urlencodeTimestamp$(date-u%Y-%m-%dT%H:%M:%SZ)\--data-urlencodeVersion2015-01-09/dev/null# 3. 等待 DNS 记录生效echo等待DNS记录生效...sleep30重要提示上方脚本为简化示例阿里云 API 需要严格的 HMAC-SHA1 签名认证实际使用需要实现完整的签名逻辑包括参数排序、URL编码、Base64编码等代码量通常在100行以上。清理 TXT 记录脚本certbot-dns-cleanup.sh#!/bin/bashACCESS_KEY_ID你的AccessKeyIdACCESS_KEY_SECRET你的AccessKeySecretDOMAINexample.com# 查询并删除之前添加的 TXT 记录# 同样需要完整的阿里云API签名逻辑RECORD_ID$(curl-shttps://alidns.aliyuncs.com/\--data-urlencodeActionDescribeSubDomainRecords\--data-urlencodeSubDomain_acme-challenge.${CERTBOT_DOMAIN}\--data-urlencodeTypeTXT\--data-urlencodeAccessKeyId${ACCESS_KEY_ID}\|python3-cimport sys,json;print(json.load(sys.stdin)[DomainRecords][Record][0][RecordId]))curl-shttps://alidns.aliyuncs.com/\--data-urlencodeActionDeleteDomainRecord\--data-urlencodeRecordId${RECORD_ID}\--data-urlencodeAccessKeyId${ACCESS_KEY_ID}\/dev/null2. 使用 hook 脚本申请泛域名证书sudocertbot certonly--manual\--preferred-challengesdns\--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# 添加定时任务echo30 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 ManagerACM提供免费证书且支持自动续期但证书只能绑定到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 定时任务—六、常见问题Q1SSL证书过期了紧急恢复怎么做第一步立即重新申请或续期证书。如果使用第三方平台登录后在证书列表点击续期几分钟即可完成。第二步将新证书部署到服务器替换过期的证书文件。第三步重载 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 服务商的 APIcertbot 本身不支持国内 DNS 服务商的 API所以需要自己写脚本来桥接。Q5多个域名能用同一个自动续期方案吗第三方平台每个证书独立生成续期命令但可以部署在同一台服务器上互不影响Certbotcertbot renew一次性检查本机所有证书但泛域名证书每个域名的 DNS hook 脚本可能不同云厂商每张证书需要单独配置且受20张年额度限制七、总结方案核心取舍第三方平台配置简单泛域名自动续期但依赖第三方服务Certbot单域名续期成熟但泛域名需自写DNS脚本门槛高云厂商托管省心但收费且不支持泛域名如果你不想折腾脚本和API签名第三方平台的自动续期上手最快但需要接受对第三方服务的依赖。如果你是命令行高手Certbot 的单域名方案足够可靠但泛域名场景下的 hook 脚本开发会让大多数人望而却步。如果你预算充足且域名少云厂商的付费服务可以考虑但20张年额度和不支持泛域名是硬伤。归根到底自动续期方案的选择取决于你的技术能力、域名规模和对第三方服务的接受程度。三种方案各有利弊没有银弹选适合自己的就好。相关阅读《2026年免费SSL证书申请全攻略5种方案对比》《申请SSL证书如何完成域名验证》《Nginx/Tengine 服务器配置 SSL 证书》《Apache 服务器安装配置 SSL 证书》
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2602629.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!