全链路无人值守自动化 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
API 密钥配置¶
腾讯云 → DNSPod 「账号中心 → API密钥」,选择 腾讯云 API 密钥 → 新建密钥,记下 SecretId 和 SecretKey
自动化配置¶
可使用 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,等待运行完成,查看腾讯云:
-
acme.sh 是一个用于 SSL / TLS 证书自动化的纯 Unix shell 脚本,实现了 acme 协议,可以从 ZeroSSL,Let's Encrypt 等 CA 生成免费的证书 ↩