news 2026/8/12 18:40:20

阿里云免费SSL证书自动化续签实战:基于CLI与脚本的运维方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
阿里云免费SSL证书自动化续签实战:基于CLI与脚本的运维方案

1. 问题缘起:免费午餐的代价

如果你用过阿里云的免费SSL证书,那你一定对那个“三个月有效期”的设定又爱又恨。爱的是,它确实免费,给个人站长、测试环境、小型项目省下了真金白银;恨的是,每三个月就要手动操作一遍申请、验证、下载、部署的流程,一旦忘记,网站就会亮起那个刺眼的“不安全”小红锁,甚至直接导致服务中断。这感觉就像家里有个需要每季度手动上发条的钟,准时是准时,但总怕哪天忘了,时间就停了。

我最初也以为这只是个小麻烦,手动操作几次就好。直到有一次,一个用于内部API测试的站点证书过期,导致整个自动化测试流程中断了大半天,我才意识到问题的严重性。这不仅仅是麻烦,更是一个潜在的运维风险点。手动续签的不可靠性,在项目规模扩大或站点数量增多时,会被急剧放大。于是,“自动化续签”从一个“锦上添花”的想法,变成了一个必须解决的“雪中送炭”的需求。

网上方案很多,Let‘s Encrypt的ACME协议是主流,但对于已经绑定在阿里云生态(域名、DNS解析都在阿里云)的用户来说,直接使用阿里云自己的免费证书,并通过其API实现自动化,是一条更顺滑、更少“上下文切换”的路径。今天要聊的,就是如何利用阿里云现有的工具链,搭建一个稳定、可靠的SSL证书自动续签体系,真正实现“一次配置,长期有效”。

2. 核心方案选型:为什么是阿里云CLI + 脚本?

面对自动续签,通常有几个主流选择:使用Certbot等ACME客户端申请Let‘s Encrypt证书、使用第三方证书管理服务,或者利用云服务商自身的API。这里我选择了基于阿里云CLI和自有脚本的方案,主要基于以下几点考量:

2.1 环境一致性优先我的域名注册、DNS解析、证书申请全在阿里云平台。使用阿里云CLI(Alibaba Cloud CLI)和其证书服务API,意味着所有操作都在同一个云环境内完成,无需将域名的DNS解析权(例如添加TXT记录)交给外部ACME客户端去验证,减少了依赖和潜在的权限风险。对于企业内网或对控制权要求高的场景,这一点尤为重要。

2.2 免费证书资源的充分利用阿里云提供的单域名免费DV证书,虽然只有三个月,但申请次数无限制,且与阿里云WAF、CDN、SLB等产品集成度非常好。直接续签它,可以无缝继承现有的部署配置(比如在SLB监听器上直接更新证书ID),避免了更换证书品牌或类型可能带来的兼容性检查和额外配置。

2.3 可控性与可调试性自己编写Shell或Python脚本,调用阿里云CLI,整个流程的每一个步骤都清晰可见、完全可控。从触发续签、等待签发、下载证书到部署到服务器,你都可以插入日志、告警和异常处理。当出现问题时,你可以像调试普通程序一样逐环节排查,而不是面对一个封装好的黑盒工具不知所措。

2.4 轻量且低成本这个方案的核心就是一个安装了阿里云CLI的轻量级环境(比如一台长期运行的ECS,甚至一个函数计算FC实例),加上一个定时任务(Cron)。几乎没有额外的服务开销,特别适合追求极致成本控制的个人或团队。

当然,这个方案需要你具备基础的Linux操作和脚本编写能力。但相信我,整个搭建过程本身,就是一次极佳的运维自动化实践。

3. 前期准备:配置你的自动化“工作台”

工欲善其事,必先利其器。在开始编写自动化脚本之前,我们需要一个可以执行命令、访问阿里云API的环境。

3.1 创建并配置RAM用户直接使用主账号的AccessKey是极不安全的。我们应该创建一个专用于证书操作的RAM用户。

  1. 登录阿里云控制台,进入访问控制(RAM)
  2. 用户页面,点击创建用户
  3. 设置用户名,例如cert-auto-renew务必勾选“控制台密码登录”和“OpenAPI调用访问”。后者才会生成AccessKey。
  4. 创建成功后,保存好生成的AccessKey ID和AccessKey Secret(只显示一次)。
  5. 为用户授权。我们需要两个权限:
    • AliyunYundunCertFullAccess:管理数字证书服务(云盾)的权限,用于申请、下载证书。
    • AliyunDNSFullAccess:管理云解析DNS的权限。虽然阿里云免费证书目前多采用“文件验证”,但保留DNS权限是为未来可能的变化或使用其他验证方式做准备,也更符合最小权限原则里的“前瞻性”。你可以创建自定义策略,将权限范围缩小到特定域名。

注意:AccessKey Secret如同密码,必须妥善保管。建议在后续脚本中使用环境变量或阿里云CLI的配置功能来管理,切勿硬编码在脚本中。

3.2 安装并配置阿里云CLI我们需要一个Linux环境来运行CLI。可以选择一台长期开机的ECS,或者一个轻量应用服务器。

  1. 安装CLI
    # 使用curl下载安装脚本并执行(以Linux x86_64为例) curl -O https://aliyuncli.alicdn.com/aliyun-cli-linux-latest-amd64.tgz tar xzvf aliyun-cli-linux-latest-amd64.tgz sudo cp aliyun /usr/local/bin/
  2. 配置CLI
    # 运行配置命令,依次填入RAM用户的AccessKey ID、Secret、默认地域(如cn-hangzhou) aliyun configure
    配置完成后,可以运行aliyun help测试是否安装成功。

3.3 准备证书部署的目标环境想清楚你的证书最终要部署到哪里。常见场景有:

  • 云服务器ECS/Nginx:证书文件(.pem, .key)需要被上传到服务器特定目录,并重载Nginx。
  • 负载均衡SLB:直接在SLB控制台更新证书,或通过API更新监听器绑定的证书ID。
  • 容器服务ACK:更新Ingress或Secret资源。
  • CDN:更新域名配置中的证书。

我们的自动化脚本需要包含“部署”这一步。本文将重点演示最经典的ECS + Nginx场景,其他场景的原理相通,只需替换对应的部署命令或API调用。

4. 自动化续签脚本核心逻辑拆解

整个自动续签流程可以分解为以下几个核心步骤,我们将用一个Bash Shell脚本将其串联起来。这个脚本将是自动化的心脏。

4.1 步骤一:检查证书状态与触发续签阿里云免费证书不能直接“续签”旧证书,而是需要为同一个域名重新申请一张新证书。因此,我们的逻辑是:在旧证书过期前(例如提前30天),检查域名是否存在有效的未过期证书。如果不存在,或即将过期,则发起新证书申请。

#!/bin/bash # 定义变量 DOMAIN="yourdomain.com" # 你的域名 EMAIL="admin@yourdomain.com" # 证书联系人邮箱 ALIYUN_CLI="/usr/local/bin/aliyun" # 阿里云CLI路径 CERT_DIR="/opt/ssl_certs" # 本地证书存储目录 DEPLOY_SCRIPT="/opt/deploy_cert.sh" # 证书部署脚本 # 创建目录 mkdir -p $CERT_DIR # 函数:记录日志 log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" } # 核心逻辑开始 log "开始SSL证书自动续签流程,域名: $DOMAIN" # 尝试获取该域名现有的免费证书列表(这里简化处理,实际应过滤状态为“已签发”且未过期的) # 注意:阿里云CLI证书列表查询可能需要较复杂的过滤,此处为示例,实战中你可能需要解析JSON并处理。 EXISTING_CERT_INFO=$($ALIYUN_CLI yundun-cert DescribeUserCertificateList --Domain $DOMAIN --CurrentPage 1 --PageSize 10) # 解析JSON,判断是否有有效证书。这里假设我们使用一个更直接的方式:总是尝试申请。 # 更严谨的做法是解析 EXISTING_CERT_INFO,找到有效期结束时间,与当前时间比较。

4.2 步骤二:申请新证书使用阿里云CLI调用申请免费证书的接口。免费证书的ProductCode是free

log "正在为域名 $DOMAIN 申请新的免费SSL证书..." APPLY_RESPONSE=$($ALIYUN_CLI yundun-cert CreateUserCertificate --Domain $DOMAIN --ProductCode free --Username $EMAIL --Output json) # 解析返回的JSON,获取证书ID(CertId) CERT_ID=$(echo $APPLY_RESPONSE | grep -o '"CertId":"[^"]*"' | cut -d'"' -f4) if [ -z "$CERT_ID" ]; then log "错误:申请证书失败,响应: $APPLY_RESPONSE" exit 1 fi log "证书申请提交成功,证书ID: $CERT_ID"

4.3 步骤三:等待证书签发并下载证书申请后,CA机构需要进行域名验证(通常是文件验证)。阿里云会自动完成验证流程,我们需要轮询证书状态,直到变为“已签发”。

# 等待证书签发的函数 wait_for_issuance() { local cert_id=$1 local max_retries=30 # 最大重试30次 local retry_interval=10 # 每次间隔10秒 for ((i=1; i<=max_retries; i++)); do log "等待证书签发,尝试第 $i/$max_retries 次..." STATUS_RESPONSE=$($ALIYUN_CLI yundun-cert DescribeUserCertificateDetail --CertId $cert_id --Output json) CERT_STATUS=$(echo $STATUS_RESPONSE | grep -o '"Status":"[^"]*"' | cut -d'"' -f4) if [ "$CERT_STATUS" == "issued" ]; then log "证书已签发成功!" return 0 elif [ "$CERT_STATUS" == "failed" ] || [ "$CERT_STATUS" == "canceled" ]; then log "错误:证书申请失败或已取消,状态: $CERT_STATUS" return 1 fi sleep $retry_interval done log "错误:等待证书签发超时。" return 1 } # 调用等待函数 if ! wait_for_issuance $CERT_ID; then exit 1 fi

证书签发后,下载包含证书链和私钥的PEM文件包。

log "证书已签发,开始下载..." DOWNLOAD_RESPONSE=$($ALIYUN_CLI yundun-cert DescribeUserCertificateDetail --CertId $CERT_ID --Output json) # 解析下载链接(示例,实际API返回字段可能不同,请以阿里云官方文档为准) # 假设返回的JSON中有 `DownloadUrl` 字段 DOWNLOAD_URL=$(echo $DOWNLOAD_RESPONSE | grep -o '"DownloadUrl":"[^"]*"' | cut -d'"' -f4 | sed 's/\\//g') if [ -z "$DOWNLOAD_URL" ]; then # 如果API不直接提供链接,则可能需要调用另一个下载接口 log "尝试通过下载接口获取证书包..." $ALIYUN_CLI yundun-cert DownloadUserCertificate --CertId $CERT_ID --Output file --filepath $CERT_DIR/cert_$CERT_ID.zip else wget -O $CERT_DIR/cert_$CERT_ID.zip "$DOWNLOAD_URL" fi if [ ! -f "$CERT_DIR/cert_$CERT_ID.zip" ]; then log "错误:下载证书包失败。" exit 1 fi log "证书包下载完成: $CERT_DIR/cert_$CERT_ID.zip"

4.4 步骤四:解压并处理证书文件下载的ZIP包内通常包含两个文件:yourdomain.com.pem(证书链)和yourdomain.com.key(私钥)。我们需要解压并重命名它们,以便后续部署。

# 解压到临时目录 UNZIP_DIR="$CERT_DIR/$CERT_ID" mkdir -p $UNZIP_DIR unzip -o $CERT_DIR/cert_$CERT_ID.zip -d $UNZIP_DIR # 找到解压后的文件 CERT_FILE=$(find $UNZIP_DIR -name "*.pem" | head -n 1) KEY_FILE=$(find $UNZIP_DIR -name "*.key" | head -n 1) if [ ! -f "$CERT_FILE" ] || [ ! -f "$KEY_FILE" ]; then log "错误:在解压包中未找到证书或私钥文件。" exit 1 fi # 将文件复制或移动到标准位置,并以域名命名 FINAL_CERT="$CERT_DIR/$DOMAIN.crt" FINAL_KEY="$CERT_DIR/$DOMAIN.key" cp $CERT_FILE $FINAL_CERT cp $KEY_FILE $FINAL_KEY log "证书文件已处理: $FINAL_CERT, $FINAL_KEY"

4.5 步骤五:部署证书到目标服务这是最关键的一步,需要根据你的实际架构来编写。以下是一个部署到同一台服务器Nginx的示例:

# 假设Nginx的证书存放路径 NGINX_CERT_DIR="/etc/nginx/ssl" sudo mkdir -p $NGINX_CERT_DIR # 备份旧证书(可选但推荐) sudo cp $NGINX_CERT_DIR/$DOMAIN.crt $NGINX_CERT_DIR/$DOMAIN.crt.bak.$(date +%Y%m%d) 2>/dev/null || true sudo cp $NGINX_CERT_DIR/$DOMAIN.key $NGINX_CERT_DIR/$DOMAIN.key.bak.$(date +%Y%m%d) 2>/dev/null || true # 部署新证书 sudo cp $FINAL_CERT $NGINX_CERT_DIR/ sudo cp $FINAL_KEY $NGINX_CERT_DIR/ sudo chmod 600 $NGINX_CERT_DIR/$DOMAIN.key # 确保私钥权限安全 # 重载Nginx配置 log "正在重载Nginx服务..." sudo nginx -t && sudo systemctl reload nginx if [ $? -eq 0 ]; then log "Nginx重载成功,新证书已生效。" else log "错误:Nginx配置测试失败,已回滚证书文件。" # 回滚操作(这里简化,实际应更严谨) sudo cp $NGINX_CERT_DIR/$DOMAIN.crt.bak.$(date +%Y%m%d) $NGINX_CERT_DIR/$DOMAIN.crt 2>/dev/null || true sudo cp $NGINX_CERT_DIR/$DOMAIN.key.bak.$(date +%Y%m%d) $NGINX_CERT_DIR/$DOMAIN.key 2>/dev/null || true exit 1 fi

4.6 步骤六:清理与通知清理临时文件,并可以集成邮件、钉钉、企业微信等通知机制,告知管理员证书已成功更新。

# 清理临时解压目录和ZIP包 rm -rf $UNZIP_DIR rm -f $CERT_DIR/cert_$CERT_ID.zip log "临时文件已清理。" # 发送成功通知(示例:写入日志,可扩展为调用webhook) log "SSL证书自动续签流程全部完成!域名 $DOMAIN 的证书已更新并部署。" # 此处可以调用 curl 发送通知到你的告警平台 # curl -X POST -H "Content-Type: application/json" -d '{"msg":"证书更新成功"}' YOUR_WEBHOOK_URL

将以上所有代码块按逻辑顺序组合,并填充你的实际变量(域名、邮箱、路径等),就形成了一个完整的自动化续签脚本,例如auto_renew_ssl.sh。记得给它加上执行权限:chmod +x auto_renew_ssl.sh

5. 实战部署与调度:让脚本自己跑起来

脚本写好了,我们需要让它定期自动执行。最经典的方式就是利用Linux系统的Cron定时任务。

5.1 配置Cron定时任务编辑当前用户的Crontab:crontab -e添加一行,例如,设置为每月1号和15号的凌晨2点30分执行,并检查证书是否在30天内过期(这个检查逻辑需要你在脚本开头实现,或使用更简单的“直接申请”策略)。

# 每月1号和15号凌晨2:30执行证书续签脚本,并将所有输出重定向到日志文件 30 2 1,15 * * /bin/bash /path/to/your/auto_renew_ssl.sh >> /var/log/ssl_auto_renew.log 2>&1

更推荐的策略:编写一个“检查-决策”脚本(主控脚本),它首先检查现有证书的过期时间,只有在证书剩余有效期小于30天时才调用上面的续签脚本。这样避免不必要的申请。

5.2 使用Systemd Timer(更现代的管理方式)对于追求更规范管理的系统,可以使用Systemd Timer。

  1. 创建服务单元文件/etc/systemd/system/ssl-renew.service
    [Unit] Description=Auto renew SSL certificate for mydomain After=network.target [Service] Type=oneshot ExecStart=/path/to/your/auto_renew_ssl.sh User=root # 或以一个有权限的非root用户运行
  2. 创建定时器单元文件/etc/systemd/system/ssl-renew.timer
    [Unit] Description=Run SSL renew monthly [Timer] OnCalendar=*-*-1,15 02:30:00 Persistent=true [Install] WantedBy=timers.target
  3. 启用并启动定时器:
    sudo systemctl daemon-reload sudo systemctl enable --now ssl-renew.timer sudo systemctl list-timers # 查看定时器状态

Systemd Timer的优势在于有更强大的日志集成(通过journalctl -u ssl-renew.service查看),并且可以处理更复杂的时间调度规则。

6. 关键细节、避坑指南与高可用考量

自动化流程搭建起来不难,但要保证其长期稳定运行,以下几个细节和“坑”必须注意。

6.1 证书验证方式与阿里云API的稳定性阿里云免费证书的验证方式可能会变化。早期多用DNS验证,现在多为文件验证。我们的脚本依赖于阿里云自动完成验证。这意味着,你的域名必须已经成功在阿里云备案(如果是国内服务器),并且解析正常。API的稳定性是基础,建议在脚本中加入对阿里云CLI命令返回值的详细判断和重试机制。

6.2 私钥安全是生命线脚本中会处理私钥文件(.key)。务必确保:

  • 脚本存储和运行的目录权限严格,避免其他用户读取。
  • 最终部署到服务器(如Nginx)后,私钥文件权限应设置为600(仅所有者可读可写)。
  • 考虑使用加密的凭据管理服务(如阿里云KMS)来动态获取AccessKey,而不是将其明文存储在服务器上。

6.3 部署环节的原子性与回滚在部署证书到Nginx时,我们采用了“先测试,再重载”的方式(nginx -t && systemctl reload nginx)。这是最基本的原子性操作。但在生产环境中,这还不够。更稳健的做法是:

  1. 将新证书文件部署到一个临时位置。
  2. 使用nginx -t -c /path/to/new/nginx.conf测试一个包含新证书路径的临时配置。
  3. 测试通过后,再用一个原子操作(如mv)替换线上的证书文件,然后重载。
  4. 始终保留最近2-3个版本的旧证书备份,并在脚本中实现一键回滚功能。

6.4 跨服务器部署场景如果你的证书需要部署到多台后端服务器,或者SLB、CDN等云产品,脚本需要相应扩展。

  • 多台ECS:可以使用Ansible、SaltStack等配置管理工具,在证书更新后触发一个Playbook,将证书文件分发到所有目标服务器并重载服务。
  • 阿里云SLB:使用阿里云CLI的slb模块命令,通过UploadServerCertificate上传证书,然后使用SetListenerAttribute更新HTTPS监听器绑定的证书ID。注意:SLB的证书是独立管理的,与证书服务里的证书不同,需要上传。
  • 函数计算FC/容器服务ACK:通常需要更新其配置中的证书ARN或Secret。这需要调用对应的API。

6.5 监控与告警:闭环的最后一步自动化不能代替监控。你必须设置监控来确认自动化任务确实成功了。

  1. 脚本执行监控:在Cron或Systemd Timer的执行命令后,添加状态上报。例如,执行成功后调用一个健康检查接口,失败时发送告警。
  2. 证书过期监控:使用独立的监控工具(如Prometheus Blackbox Exporter、UptimeRobot等)定期检查网站SSL证书的过期时间,并在证书过期前N天(如15天、7天)发出告警。这是对自动续签流程的双重保障。
  3. 日志集中分析:将脚本输出的日志(/var/log/ssl_auto_renew.log)接入ELK或Graylog等日志系统,便于排查问题。

6.6 处理“申请过于频繁”的限制虽然阿里云免费证书没有明确的总申请次数限制,但短时间内对同一域名频繁申请可能会触发风控。我们的定时任务设置为每月两次,是相对安全的频率。如果在调试期间需要多次申请,建议先使用测试域名,或间隔一段时间再试。

7. 方案优化与进阶思路

基础的跑通只是开始,要让这个体系更健壮,可以考虑以下优化方向。

7.1 从Shell脚本到Python/Go实现对于更复杂的逻辑(如JSON解析、错误重试、多域名批量处理、状态机管理),使用Python或Go编写是更好的选择。阿里云也提供了完善的SDK(如Python SDKaliyun-python-sdk-core),代码可读性和可维护性会更强。你可以用Python的subprocess调用阿里云CLI,或者直接使用SDK调用API。

7.2 与基础设施即代码(IaC)结合如果你的服务器架构是用Terraform、Pulumi等IaC工具管理的,可以考虑将证书申请和初始部署也纳入IaC流程。自动续签则作为运维阶段的独立流程。两者结合,实现从创建到运维的全生命周期自动化。

7.3 使用Serverless函数计算(FC)如果你不想维护一台长期运行的ECS,可以将续签脚本部署到阿里云函数计算(FC)。FC可以配置定时触发器,每月执行一次。你需要将证书文件最终上传到OSS,然后通过内网或脚本通知你的服务器从OSS拉取并部署新证书。这实现了真正的“无服务器”自动化,成本可能更低。

7.4 多域名与泛域名证书管理上述脚本是针对单个域名的。如果你有多个域名,甚至需要泛域名证书,脚本需要改造为循环处理一个域名列表。对于泛域名证书,阿里云免费证书不支持,你需要购买付费证书或使用Let‘s Encrypt(通过DNS验证)。这时,你的脚本就需要集成阿里云DNS的API来自动添加和删除TXT记录,复杂度会上升一个等级。

7.5 建立证书仓库将所有证书(包括私钥)加密后存储在一个安全的中央仓库中,如HashiCorp Vault或阿里云KMS。应用程序或部署脚本从仓库中动态获取证书,而不是存放在每台服务器的文件系统里。这大大提升了密钥管理的安全性和合规性。

整个自动续签体系的搭建,是一个典型的“运维即代码”实践。它开始可能只是一个简单的脚本,但随着你对可靠性、安全性和扩展性要求的提高,它会逐渐演变成一个包含状态管理、错误处理、多环境支持、安全审计的小型系统。这个过程本身,就是对云原生运维能力的一次扎实锻炼。当你看到证书在凌晨悄无声息地更新完毕,而网站全天候稳定运行时,那种一切尽在掌控的安心感,就是自动化带来的最大回报。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/12 18:39:28

Windows 10 下 AirSim + Unreal Engine 4.27.2 环境搭建全攻略与避坑指南

1. 项目概述与核心价值 最近在折腾无人机和自动驾驶的仿真项目&#xff0c;发现AirSim这个微软开源的仿真平台是真香&#xff0c;它基于Unreal Engine&#xff0c;能提供极其逼真的物理环境和传感器模拟。但说实话&#xff0c;第一次在Windows 10上搭建AirSim Unreal Engine 4…

作者头像 李华
网站建设 2026/8/12 18:36:39

Java 大模型服务怎么验:Schema、依赖隔离与 Eval 回归

Java 大模型服务怎么验&#xff1a;Schema、依赖隔离与 Eval 回归 模型回答“看起来通顺”并不能说明它能进入业务链路。结构化输出可能不符合契约&#xff0c;检索结果也可能和回答脱节。评估应把这两类问题拆开&#xff1a;先校验硬约束&#xff0c;再用固定样本集观察回答质…

作者头像 李华
网站建设 2026/8/12 18:35:55

Windows Defender深度管控指南:从原理到脚本实现彻底静默

1. 项目概述与核心诉求 最近在几个技术群里&#xff0c;经常看到有朋友在讨论一个老生常谈但又总有人踩坑的问题&#xff1a;怎么在Windows 10和11上彻底关掉或者移除Windows Defender。有人是为了跑一些自己写的脚本或者小众开发工具&#xff0c;被误报拦截搞得心烦意乱&#…

作者头像 李华
网站建设 2026/8/12 18:35:35

Linux 终端命令速查表 -- 07 文件与文件夹速查表

目录导航 pwd 打印当前所在目录。 pwdcd 切换到另一个目录:传入路径,或使用快捷方式。 cd [path]向上返回一级,到父目录。 cd ..跳转到主目录(直接输入 cd 命令后直接按【 enter 】键效果相同)。 cd ~返回之前所在的目录。 cd -列出内容 ls 列出目录内容。-l 显示详…

作者头像 李华
网站建设 2026/8/12 18:34:36

终极解决方案:3分钟让Windows资源管理器完美显示HEIC缩略图

终极解决方案&#xff1a;3分钟让Windows资源管理器完美显示HEIC缩略图 【免费下载链接】windows-heic-thumbnails Enable Windows Explorer to display thumbnails for HEIC/HEIF files 项目地址: https://gitcode.com/gh_mirrors/wi/windows-heic-thumbnails 如果你正…

作者头像 李华
网站建设 2026/8/12 18:31:36

如何快速解密QQ音乐.mflac/.mgg文件:终极免费解决方案

如何快速解密QQ音乐.mflac/.mgg文件&#xff1a;终极免费解决方案 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web 项目地址: https…

作者头像 李华