跳到主要内容

利用群晖 docker 更新七牛云证书

· 阅读需 5 分钟

用七牛的对象存储很多年了,一直用的云厂商的一年期免费证书,到期手动替换。不过今年开始云厂商普遍将免费证书的周期限制为3个月了,导致我的七牛云每次更新证书相当麻烦,刚好家里有群晖,就折腾了一下用 docker 自动更新云厂商的证书。

acme.sh

简单介绍一下 acme.sh,它实现了 acme 协议,可以从 ZeroSSLLet's Encrypt 等 CA 生成免费的证书。

具有以下特点:

  • 支持使用多种方式验证域名所有权
  • 支持多种 CA 服务商
  • 支持签发单域名,泛域名证书
  • 支持证书自动续签
  • 支持云厂商api部署证书

环境准备

在运行之前需要准备一些配置文件

配置文件

在运行镜像之前,需要准备一份配置文件以备 docker 运行时设置环境变量。

创建一个 acme.sh 文件夹,写入一个空白文本文件命名为 account.conf

/acme.sh/account.conf
export DP_Id=123123
export DP_Key=xxxyyyzzz

export QINIU_AK="010101"
export QINIU_SK="101010"
export QINIU_CDN_DOMAIN="cdn.example.com"

主要包含两部分,DNS验证配置和部署配置。值得一提的是验证方式除了使用DNS服务商的api之外还可以使用http验证,但是受限于家宽的80端口不可用,所以是不适用的。

DNS API 验证配置

acme.sh 支持的 DNS服务商 有很多,我的域名托管在腾讯云的 dnspod.cn 上,创建对应的 token 复制即可。

deploy api 部署配置

同样的 acme.sh 也支持通过云厂商的api部署证书,具体有哪些允许通过这种方式部署,可以到 GitHub 上查看。到 七牛控制台 创建密钥复制;同时指定要部署的域名。

配置容器

使用群晖 Container Manager 获取 acme.sh 镜像

接着开始创建容器:

创建容器

设置文件夹读取,把刚才的配置文件所在的文件夹挂载到容器的 /acme.sh 中,这里的挂载路径是 固定的

共享文件夹

根据 文档显示,为了方便续签,需要设置 docker daemon 守护进程:

Running acme.sh as a docker daemon, so that it can handle the renewal cronjob automatically.

docker daemon

其他设置可以保持默认:

配置总览

证书创建及部署

启动容器后,打开终端机,通过命令 sh 启动:

sh

acme.sh --upgrade --auto-upgrade # 设置自动更新
acme.sh --set-default-ca --server letsencrypt # 修改默认CA
acme.sh --issue -d cdn.example.com --dns dns_dp # 验证域名签发证书
acme.sh --deploy -d cdn.example.com --deploy-hook qiniu # 部署证书到七牛云CDN

这样就会成功地更新七牛云的证书了并且后续会自动更新。

acme.sh 脚本目前的默认 CA 服务器是 ZeroSSL,需要注册账号,所以这里在签发证书之前进行了修改。

群晖定时任务

在群晖的环境中还可以创建群晖定时任务执行更新,需要注意的是,这里创建的任务用户账号使用 root 账户,其中 neilpang-acme-sh创建时的容器名称

docker exec neilpang-acme-sh acme.sh --deploy -d cdn.example.com --deploy-hook qiniu

在生成部署过一次证书之后 acme.sh 会记下本次部署配置,在证书即将到期时会自动续期部署,所以这个定时任务并不是必要的,只是一种额外执行 docker 的方式。