跳转到正文
JayHai的小站
返回

零成本!GitHub Actions + acme.sh 实现 SSL 证书全自动续期

个人网站 SSL 全自动续期

🎯 本文记录了一个完整的个人网站上线流程:从腾讯云注册域名、绑定 CloudBase 静态托管、到利用 GitHub Actions + acme.sh 实现 SSL 证书自动续期。适合独立开发者和个人博客站长参考。


📖 目录


一、全局架构概览

┌─────────────┐     push      ┌──────────────────┐
│  本地开发     │ ──────────▶  │  GitHub 仓库      │
└─────────────┘               └────────┬─────────┘

                          ┌────────────┼────────────┐
                          ▼                         ▼
                 🔨 部署工作流              🔐 SSL 续期工作流
                 (deploy.yml)           (ssl-auto-renew.yml)
                          │                         │
                          ▼                         ▼
               ☁️ CloudBase 静态托管        📜 ssl/ 目录 (证书文件)
                          │                         │
                          ▼                         ▼
               🌐 自定义域名 jayhai.cn    👩‍💻 手动粘贴到腾讯云控制台

技术栈一览:

组件技术选型说明
🏗️ 静态站点框架Astro高性能静态站点生成器
☁️ 托管平台腾讯云 CloudBase静态网站托管 + CDN
🌐 域名服务腾讯云 DNSPod域名注册 + DNS 解析
🔐 SSL 证书Let’s Encrypt免费、自动化、开放的 CA
🤖 自动化GitHub Actions + acme.sh定时自动申请/续期证书

二、域名注册与 ICP 备案

2.1 🛒 注册域名

  1. 前置条件:腾讯云账号已完成 ✅ 实名认证

  2. 创建域名信息模板

    • 📍 进入 信息模板页面
    • 填写域名所有者信息(个人/企业)
    • ⏳ 提交后等待审核,通常 1-3 个工作日
  3. 搜索并注册域名

    • 📍 进入 域名注册页面
    • 🔍 搜索你心仪的域名,确认可注册
    • 选择已审核通过的信息模板,💰 完成支付

⚠️ 注意:域名属于即时产品,注册成功后 不可退款

2.2 📋 ICP 备案(必须!)

如果网站面向中国大陆用户,CloudBase 绑定自定义域名 强制要求域名已完成 ICP 备案


三、CloudBase 静态托管与域名绑定

3.1 ➕ 添加自定义域名

  1. 📍 登录 云开发控制台
  2. 进入你的环境 → 左侧菜单 HTTP 访问服务
  3. 点击 添加域名,填写配置:
    • 域名jayhai.cn
    • 证书关联:选择已有证书或上传新证书
    • 协议类型Http & Https
    • 接入方式云开发 CDN 接入
  4. 点击 添加该域名路由

3.2 ✅ 域名所有权验证

CloudBase 会要求验证域名所有权,有三种方式(推荐第一种 👇):

方式操作推荐度
🥇 CNAME 记录将域名 CNAME 到 xxx.cdn.dnsv1.com⭐⭐⭐
🥈 TXT 记录域名 TXT 记录设为 CloudBase 环境 ID⭐⭐
🥉 子域名 TXT_cloudbase-challenge.域名 TXT 设为环境 ID

3.3 🔧 配置 DNS 解析

  1. 📍 进入 域名服务控制台
  2. 找到你的域名 → 点击 解析
  3. 添加 CNAME 记录:
主机记录记录类型记录值说明
@CNAMExxx.cdn.dnsv1.com根域名
wwwCNAMExxx.cdn.dnsv1.comwww 子域名

📌 注意:CNAME 记录不能与 A 记录共存,如有冲突需先删除 A 记录。

  1. ⏳ DNS 解析通常 5-30 分钟 生效,可用命令验证:
    nslookup jayhai.cn

四、SSL 证书自动续期方案

4.1 🧠 方案思路

痛点:腾讯云免费 SSL 证书有效期 1 年,每次手动申请很繁琐。

解决方案:利用 GitHub Actions 定时触发 acme.sh,通过腾讯云 DNSPod API 自动完成 DNS 验证,从 Let’s Encrypt 获取免费证书(有效期 90 天),自动续期并提交到仓库。

⏰ 定时触发 (每天凌晨2点)


🔧 安装 acme.sh


🔑 配置腾讯云 API 密钥


📡 DNS-01 验证 (自动添加/删除 TXT 记录)


📜 获取证书 → 保存到 ssl/ 目录


📤 git commit & push 回仓库

4.2 🔑 准备腾讯云 API 密钥(最小权限原则)

🛡️ 安全第一!只给 DNS 解析相关的最小权限。

第一步:创建权限策略

📍 登录 腾讯云访问管理控制台新建自定义策略按策略语法创建空白模板

{
    "statement": [
        {
            "action": [
                "dnspod:DescribeRecordFilterList",
                "dnspod:DescribeRecordList",
                "dnspod:CreateRecord",
                "dnspod:DeleteRecord"
            ],
            "effect": "allow",
            "resource": ["*"]
        }
    ],
    "version": "2.0"
}

第二步:创建子账号

📍 进入 用户列表新建用户快速创建

4.3 🔒 配置 GitHub Secrets

📍 GitHub 仓库 → SettingsSecrets and variablesActionsNew repository secret

Secret Name
TCB_SECRET_ID腾讯云子账号的 SecretId
TCB_SECRET_KEY腾讯云子账号的 SecretKey

4.4 📝 GitHub Actions 工作流

创建文件 .github/workflows/ssl-auto-renew.yml

name: Auto Renew SSL Certificate

on:
  # ⏰ 定时触发:每天 UTC 18:00 (北京时间凌晨 2:00)
  schedule:
    - cron: '0 18 * * *'
  # 🖱️ 手动触发
  workflow_dispatch:

permissions:
  contents: write

jobs:
  renew-ssl:
    runs-on: ubuntu-latest
    steps:
      # 1️⃣ 检出代码
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          token: ${{ secrets.GITHUB_TOKEN }}

      # 2️⃣ 安装 acme.sh
      - name: Install acme.sh
        run: |
          curl https://get.acme.sh | sh -s email=your-email@example.com
          echo "$HOME/.acme.sh" >> $GITHUB_PATH

      # 3️⃣ 设置腾讯云 API 环境变量
      - name: Set Tencent Cloud Secrets
        run: |
          echo "Tencent_SecretId=${{ secrets.TCB_SECRET_ID }}" >> $GITHUB_ENV
          echo "Tencent_SecretKey=${{ secrets.TCB_SECRET_KEY }}" >> $GITHUB_ENV

      # 4️⃣ 申请或续期证书
      - name: Issue or Renew Certificate
        run: |
          ~/.acme.sh/acme.sh --issue --dns dns_tencent \
            -d jayhai.cn \
            -d '*.jayhai.cn' \
            --dnssleep 120 \
            --server letsencrypt \
            --debug

      # 5️⃣ 安装证书到仓库目录
      - name: Install Certificate to Repository
        run: |
          mkdir -p ./ssl
          ~/.acme.sh/acme.sh --install-cert -d jayhai.cn \
            --key-file ./ssl/private.key \
            --fullchain-file ./ssl/certificate.crt

      # 6️⃣ 提交并推送
      - name: Commit and Push Certificates
        run: |
          git config user.name "github-actions[bot]"
          git config user.email "github-actions[bot]@users.noreply.github.com"
          git add ./ssl/
          git diff --quiet && git diff --staged --quiet || \
            git commit -m "chore: auto-renew SSL certificates"
          git push

4.5 ⚠️ 关键参数说明

参数说明为什么需要
--server letsencrypt指定 Let’s Encrypt 为 CAacme.sh v3 默认用 ZeroSSL,其 DNS 验证容易超时卡住 🐛
--dnssleep 120DNS 记录等待 120 秒给腾讯云 DNSPod TXT 记录足够的传播时间 ⏳
--dns dns_tencent使用腾讯云 DNS API 插件自动添加/删除验证用的 TXT 记录 🤖
--debug开启调试日志出问题时方便排查 🔍

🐛 踩坑经验:不加 --server letsencrypt 时,acme.sh 默认使用 ZeroSSL,DNS-01 验证会卡在 processing 状态,最终返回 retry-after: 86400(24小时),导致 acme.sh 报错退出:

The retryafter=86400 value is too large (> 600), will not retry anymore.

切换到 Let’s Encrypt 后一次成功 ✅


五、手动更新 CloudBase 证书

🔔 目前 CloudBase CLI 不支持通过命令行上传自定义 SSL 证书,需要手动操作。

5.1 📥 获取证书内容

GitHub Actions 续期成功后,仓库 ssl/ 目录会更新两个文件:

文件用途
ssl/certificate.crt📜 证书内容(fullchain)
ssl/private.key🔑 私钥内容

在 GitHub 仓库页面打开这两个文件,分别复制全部内容。

5.2 🔄 在腾讯云控制台更新

  1. 📍 登录 腾讯云 SSL 证书控制台
  2. 找到当前绑定的证书 → 点击 更新
  3. 选择:
    • 更新方式上传证书
    • 证书标准国际标准
  4. 粘贴内容:
    • 签名证书:粘贴 certificate.crt 的内容
    • 签名私钥:粘贴 private.key 的内容
  5. 点击 🔘 提交更新

💡 提交后会自动替换部署在下列云资源上的旧证书,无需额外操作。

5.3 📅 更新频率

Let’s Encrypt 证书有效期 90 天,acme.sh 默认在证书到期前 30 天 自动续期。

实际上你只需要关注:


六、踩坑记录与经验总结

🐛 踩坑 1:ZeroSSL DNS 验证超时

现象:acme.sh 默认使用 ZeroSSL 作为 CA,DNS-01 验证一直卡在 processing,轮询 8 次后服务器返回 retry-after: 86400,acme.sh 放弃。

原因:ZeroSSL 的 DNS 验证服务不稳定,尤其对中国域名。

解决:添加 --server letsencrypt 切换 CA ✅

🐛 踩坑 2:DNS 记录传播太慢

现象:60 秒等待后 CA 仍然查不到 TXT 记录。

解决:将 --dnssleep 从 60 增加到 120 秒 ✅

📌 经验总结

💡 经验说明
CA 选 Let’s Encrypt比 ZeroSSL 更稳定,社区支持更好
DNS 等待时间给足120 秒比较稳妥,避免验证失败
最小权限原则子账号只给 DNS 解析的 4 个 API 权限
证书存仓库方便追踪更新历史,配合 git log 一目了然
开启 debug首次运行务必带 --debug,出问题能快速定位

🎉 最终效果

✅ 域名注册 + ICP 备案完成 ✅ CloudBase 静态托管 + 自定义域名绑定 ✅ GitHub Actions 每天自动检查证书 ✅ 证书到期前 30 天自动续期 ✅ 新证书自动提交到仓库 ssl/ 目录 ✅ 每 60 天花 2 分钟手动粘贴到腾讯云控制台 ✅ 是的,我的个人网站已经上线啦😆;欢迎访问JayHai的小站

🤔 未来优化方向:等腾讯云 CloudBase 开放证书更新 API 后,可以在 GitHub Actions 中直接调用 API 自动更新,实现 100% 全自动化 🚀


分享到:

下一篇
Mac 微信优雅双开指南