跳转至

全链路无人值守自动化 SSL

起因

腾讯云的免费 SSL 证书有效期只有 3 个月,且不支持自动续签,不是很方便(其他云厂商也类似)

解决方案

  • A:每三个月手动更新一次(免费 + 手动续签 + 手动上传)
  • B:使用 Let's Encrypt + acme.sh / Certbot 脚本(免费 + 自动续签 + 自动上传)
  • C:购买付费证书(付费 + 自动续签 + 无需上传)

B,使用:acme.sh1 + GitHub Actions 技术方案

脚本特色

基于以上选择,撸了一套 全链路无人值守自动化 SSL 方案,具备以下特色:

功能模块 特色说明
高可靠设计 ✓ 面向长期稳定运行设计,适合云原生自动化部署
全自动运维 ✓ 无需人工干预,实现 SSL 证书生命周期全自动管理
自动签发 ✓ 自动调用 Let’s Encrypt 申请证书
智能续期 ✓ 仅在证书即将过期时续签,避免无效请求
云端集成 ✓ 自动上传证书至腾讯云 SSL 证书管理
CDN 热更新 ✓ 自动更新 CDN HTTPS 配置并立即生效

源码流程

源码下载:acme-auto.yml

执行流程如下:

trigger workflow
restore ~/.acme.sh state
install acme.sh if needed

if cert_not_exist
    issue
else
    cron (renew or skip)

check cert hash
      ├── unchanged → exit
      └── changed
        upload cert
        update CDN

配置使用

脚本以腾讯云为样例,如需使用其他云厂商,只需把脚本中的步骤代码 Deploy to Tencent Cloud 替换为对应的版本

DNSPod Token 配置

腾讯云 → DNSPod 「账号中心 → API密钥」,选择 DNSPod Token → 创建密钥,记下 ID 和 Token

ID:668000
Token:1md3646b5c4d7ba5969c48e521629ird

API 密钥配置

腾讯云 → DNSPod 「账号中心 → API密钥」,选择 腾讯云 API 密钥 → 新建密钥,记下 SecretId 和 SecretKey

SecretId:AKID441jEXeZJp9LL8kA22BlAML9k8NjttKU
SecretKey:86628FFG4e1B7u52LSbcTHzdDl7Xlrtip

自动化配置

可使用 GitHub Actions 工作流来触发定时任务完成证书的自动签发、上传与更新(省去云服务器)

创建 GitHub 仓库

在 GitHub 创建一个私有仓库

设置仓库 secrets

仓库 → Settings → Secrets and variables → Actions → New repository secret,分别添加:

Secret 名称 内容 来源
DP_Id DNSPod ID DNSPod 控制台
DP_Key DNSPod Token DNSPod 控制台
QCLOUD_SECRET_ID 腾讯云 SecretId 腾讯云访问管理
QCLOUD_SECRET_KEY 腾讯云 SecretKey 腾讯云访问管理
DOMAIN 你的备案域名 备案域名
ACME_EMAIL 随意一个真实邮箱 手动填写

创建工作流

仓库首页 → Add file → Create a new file: .github/workflows/acme-auto.yml,内容见 源码下载

运行与测试

仓库 → Actions → 选中左侧 Auto SSL Renew & Deploy (Tencent Cloud) → 点击右侧 Run workflow,等待运行完成,查看腾讯云:

  • SSL 证书 → 我的证书,查看是否存在刚上传的 AutoSSL-{domain} 证书(记下ID)
  • 内容分发网络 CDN → 证书配置,查看域名对应的证书是否已更新为最新证书(看证书ID)

  1. acme.sh 是一个用于 SSL / TLS 证书自动化的纯 Unix shell 脚本,实现了 acme 协议,可以从 ZeroSSL,Let's Encrypt 等 CA 生成免费的证书