我记得最早折腾七牛云 CDN 的 HTTPS,其实还挺兴奋的。那会儿觉得——免费 CDN + 免费证书,组合起来几乎就是“白嫖界的天花板”。但用着用着,很快就遇到了一个特别现实的问题:证书只有 90 天。

说实话,第一次还挺新鲜,第二次还能忍,到第三次的时候我已经开始烦了。
因为每 90 天你就得做一套重复动作:申请证书 → 下载 → 登录七牛后台 → 上传 → 替换。
流程不复杂,但就是——烦,而且非常容易忘。
有几次我真的是等到浏览器开始报错才想起来:“啊,对,证书又过期了。”
后来我就开始琢磨:这事儿有没有办法一劳永逸?
那个让人头疼的 90 天
其实问题不在七牛。
根源是 Let’s Encrypt 这种 ACME 证书体系,本身就是 90 天有效期。
设计初衷是安全——证书周期短,泄露风险更低。
理念没问题,但对运维来说就有点折磨。
常见的解决办法其实就三种:
第一种:老老实实手动更新
给自己设个日历提醒,每三个月操作一次。
理论上可行,但人嘛,总会忘。尤其是手上项目多的时候。
第二种:直接买一年期证书
简单粗暴。
但如果你只是个个人项目、小站点,或者像我这样有一堆测试域名……
一年期证书的成本其实挺浪费的。
第三种:自己写脚本
这是很多人的路线。
写个脚本用 acme.sh 自动申请证书,再调七牛 API 上传。
但很快又会遇到新问题:
- 需要一台服务器跑定时任务
- 环境变量和密钥管理
- 脚本维护
- 机器挂了怎么办
慢慢就会发现,这东西越来越像一个小系统。
我当时就想:既然如此,不如直接把它做成一个容器。
后来就有了这个自动续期方案
思路其实很简单:
把几件事情自动串起来:
- 用 acme.sh 申请证书
- 验证域名(DNS 或 HTTP)
- 拿到证书后调用 七牛云 API 上传
- 每天检查证书剩余时间
- 如果快过期了就自动续期
然后把这一整套逻辑打进 Docker 里。
容器只负责一件事:
守着你的证书别过期。
结构大概像这样:
acme.sh 申请证书
│
▼
Let's Encrypt 签发
│
▼
自动脚本上传证书
│
▼
七牛云 CDN 更新
│
▼
守护进程每天检查
如果发现:
证书剩余时间 < 7 天
那就重新申请 → 自动上传。
整个过程完全不需要人参与。
实际跑起来是这样的
部署其实非常简单。
我现在基本都用一条 Docker 命令:
docker run -d \
--name qiniu-auto-cert \
--restart always \
-e DOMAIN="buildbuffer.cdn.zuoxueba.org" \
-e EMAIL="your-email@example.com" \
-e QINIU_AK="your_qiniu_access_key" \
-e QINIU_SK="your_qiniu_secret_key" \
-e DNS_API="dns_cf" \
-e CF_Token="your_cloudflare_token" \
-v qiniu-acme-data:/root/.acme.sh \
yingdao/qiniu-auto-cert:latest
基本只要填几个参数:
- 域名
- 邮箱
- 七牛 AK / SK
- DNS API
然后就可以不管了。
证书会存在 /root/.acme.sh 里,如果挂了数据卷,容器重启也不会丢。
为什么我更推荐 DNS 验证
这里有个很多人第一次会踩的坑。
如果你的域名是 CNAME 到七牛 CDN,那 Let’s Encrypt 做 HTTP 验证时,其实访问的是 七牛服务器,而不是你自己的机器。
这时候 HTTP 验证就会失败。
所以比较稳的方式是:
DNS 验证。
比如:
- Cloudflare
- DNSPod
- 阿里云
- 腾讯云
只要给 API Token,acme.sh 会自动加 TXT 记录完成验证。
说白了就是:
不依赖服务器环境。
这一点其实很省心。
有时候我挺喜欢这种“小工具”
它不是那种很宏大的项目。
没有复杂架构,没有很炫的技术。
但解决了一个特别具体、特别真实的问题:
不想再记 90 天。
机器记就好了。
最后
如果你也在用七牛 CDN,又不想每三个月手动换证书,其实可以试试这个方案。
部署一次,基本就可以忘掉这件事了。
项目地址在这里:
- GitHub
https://github.com/hi-unc1e/qiniu-auto-cert - Docker Hub
https://hub.docker.com/r/yingdao/qiniu-auto-cert
如果觉得有点用,给个 ⭐ 就挺好。
不是为了炫耀,也不是多牛的东西。
只是把一个我自己踩过的坑,顺手填平了而已。