使用 neilpang/acme.sh docker容器实现自动化
在上一篇 升级群晖到 7.0 版本的 HTTPS 和 Vaultwarden 配置方案 中,我们完成了 SSL 证书的配置,不过最近经周围使用 NAS 的朋友提醒,acme.sh 实际上提供了一种配置的方式,参见:https://github.com/acmesh-official/acme.sh/wiki/Synology-NAS-Guide

使用这篇文档提供的方式相比之前有如下优势:

使用群晖提供的导入证书 API,不会直接读写群晖相关目录

群晖内部逻辑更新不会影响我们更新 SSL 证书

acme.sh 对群晖更新证书维护能力更好

本文以我的使用场景为例,结合官方文档进行配置。

我当前选择的方式如下:

域名从阿里云购买,DNS 自然也在阿里云配置

使用 ZeroSSL 申请证书

使用 Docker 容器在群晖本机部署
在 ZeroSSL 注册账户并生成 EAB Credentials
和 Let's Encrypt 不同,ZeroSSL 需要先注册个账户。

生成 EAB Credentials 网址为:https://app.zerossl.com/developer

使用 Docker 容器在本地注册 ZeroSSL 账户配置
首先创建一个 /volume1/docker/acme 目录用来保存 acme.sh 一些信息,然后执行如下命令:

docker run --rm \
-v "/volume1/docker/acme":/acme.sh \
--net=host \
neilpang/acme.sh \
--register-account --server zerossl --eab-kid "在上一步复制的 EAB KID" --eab-hmac-key "在上一步复制的 EAB HMAC Key"


申请证书

我的申请证书命令如下:
export DOMAIN=购买的域名

docker run --rm \
-v "/volume1/docker/acme":/acme.sh \
-e Ali_Key="阿里云 Key" \
-e Ali_Secret="阿里云 Secret" \
--net=host \
neilpang/acme.sh \
--issue --dns dns_ali --dnssleep 60 -d "${DOMAIN}" -d "*.${DOMAIN}" --server zerossl

这里补充了 -d "*.${DOMAIN}" 是为了申请泛域名让一个证书可以用给多个域名。

${DOMAIN}书写参考
--issue --dns dns_ali --dnssleep 60 -d  填写你的域名.cc  -d '*.填写你的域名.cc'
这段命令可以直接生成泛域名证书

你需要参考 acme.sh 官方文档,完成自己对应服务商的申请配置。

部署证书到群晖
我的部署命令如下:

export DOMAIN=购买的域名

docker run --rm \
-v "/volume1/docker/acme":/acme.sh \
-e SYNO_Username="username群晖账号" \
-e SYNO_Password="password群晖密码" \
-e SYNO_Certificate="" \
--net=host \
neilpang/acme.sh \
--deploy -d "${DOMAIN}" -d "*.${DOMAIN}" \
--deploy-hook synology_dsm

--deploy-hook synology_dsm 通过调用群晖提供的 API 完成证书的导入更新,所以需要配置一个可以更新证书的用户名和密码。SYNO_Certificate 用于指定证书的描述信息,为空是设置到默认证书上。我这里只需要这一个证书,所以设置为空内容即可。
注意:群晖账号必须是有administrator的权限推荐各位自行新建一个账户密码
注意书写规范:--deploy -d "你的域名.cc" -d "*.你的域名.cc" \

这里推荐网络使用 host 模式,容器可以直接访问 localhost:5000。

配置定时任务
以上到完成后,我们再配置一个定时任务就可以了,需要配置的只有两部分,申请证书和部署证书到群晖。本地注册 ZeroSSL 只需要执行一次。

我的群晖任务计划完整定时任务配置如下:
export DOMAIN=购买的域名
docker run --rm \
-v "/volume1/docker/acme":/acme.sh \
-e Ali_Key="阿里云 Key" \
-e Ali_Secret="阿里云 Secret" \
--net=host \
neilpang/acme.sh \
--issue --dns dns_ali --dnssleep 60 -d  你的域名.cc  -d '*.你的域名.cc'

docker run --rm \
-v "/volume1/docker/acme":/acme.sh \
-e SYNO_Username="群晖账号name" \
-e SYNO_Password="群晖密码password" \
-e SYNO_Certificate="" \
--net=host \
neilpang/acme.sh \
--deploy -d "你的域名.cc" -d "*.你的域名.cc" \
--deploy-hook synology_dsm

我遇到的问题
如果你遇到了 Create new order error. Le_OrderFinalize not found. {"type":"urn:ietf:params:acme:error:malformed","status":400,"detail":"A Key ID MUST be specified"} 错误,说明需要在 ZeroSSL 重新生成一个 EAB Credentials。

参考链接:

  • https://github.com/acmesh-official/acme.sh/wiki/Synology-NAS-Guide 你可以在这里找到更多群晖部署的配置变量完成更灵活的配置,比如在另一台设备上部署 SSL 到多台群晖中

  • https://github.com/acmesh-official/acme.sh/wiki/Run-acme.sh-in-docker

参考文章:https://www.bilibili.com/read/cv13914241?from=search