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


说实话,第一次还挺新鲜,第二次还能忍,到第三次的时候我已经开始烦了。

因为每 90 天你就得做一套重复动作:申请证书 → 下载 → 登录七牛后台 → 上传 → 替换。

流程不复杂,但就是——烦,而且非常容易忘

有几次我真的是等到浏览器开始报错才想起来:“啊,对,证书又过期了。”

后来我就开始琢磨:这事儿有没有办法一劳永逸?


那个让人头疼的 90 天

其实问题不在七牛。

根源是 Let’s Encrypt 这种 ACME 证书体系,本身就是 90 天有效期
设计初衷是安全——证书周期短,泄露风险更低。

理念没问题,但对运维来说就有点折磨。

常见的解决办法其实就三种:

第一种:老老实实手动更新

给自己设个日历提醒,每三个月操作一次。

理论上可行,但人嘛,总会忘。尤其是手上项目多的时候。


第二种:直接买一年期证书

简单粗暴。

但如果你只是个个人项目、小站点,或者像我这样有一堆测试域名……
一年期证书的成本其实挺浪费的。


第三种:自己写脚本

这是很多人的路线。

写个脚本用 acme.sh 自动申请证书,再调七牛 API 上传。

但很快又会遇到新问题:

  • 需要一台服务器跑定时任务
  • 环境变量和密钥管理
  • 脚本维护
  • 机器挂了怎么办

慢慢就会发现,这东西越来越像一个小系统。

我当时就想:既然如此,不如直接把它做成一个容器。


后来就有了这个自动续期方案

思路其实很简单:

把几件事情自动串起来:

  1. acme.sh 申请证书
  2. 验证域名(DNS 或 HTTP)
  3. 拿到证书后调用 七牛云 API 上传
  4. 每天检查证书剩余时间
  5. 如果快过期了就自动续期

然后把这一整套逻辑打进 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,又不想每三个月手动换证书,其实可以试试这个方案。

部署一次,基本就可以忘掉这件事了。

项目地址在这里:

如果觉得有点用,给个 ⭐ 就挺好。

不是为了炫耀,也不是多牛的东西。

只是把一个我自己踩过的坑,顺手填平了而已。