利用群晖 docker 更新七牛云证书
用七牛的对象存储很多年了,一直用的云厂商的一年期免费证书,到期手动替换。不过今年开始云厂商普遍将免费证书的周期限制为3个月了,导致我的七牛云每次更新证书相当麻烦,刚好家里有群晖,就折腾了一下用 docker 自动更新云厂商的证书。
acme.sh
简单介绍一下 acme.sh,它实现了 acme
协议,可以从 ZeroSSL
,Let's Encrypt
等 CA 生成免费的证书。
具有以下特点:
- 支持使用多种方式验证域名所有权
- 支持多种 CA 服务商
- 支持签发单域名,泛域名证书
- 支持证书自动续签
- 支持云厂商api部署证书
环境准备
在运行之前需要准备一些配置文件
配置文件
在运行镜像之前,需要准备一份配置文件以备 docker
运行时设置环境变量。
创建一个 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.
其他设置可以保持默认:
证书创建及部署
启动容器后,打开终端机,通过命令 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
的方式。