使用 acme.sh 和 Docker 为 群晖(Synology)NAS 申请 SSL 证书

申请证书时,acme.sh 是个真正的好工具,但是在 NAS 系统这种高度不可控的环境下,要怎么使用呢……

前言

群晖 NAS 内置了 Let’s Encrypt 的证书申请功能,可以为其申请免费的 SSL 证书,并且可以指定域名。然而,群晖 NAS 内置的证书申请功能需要开放能被 Let’s Encrypt 访问的 80 或 443 端口,很多时候这是无法做到的。因此,我们需要另辟蹊径,使用 acme.sh 和 Docker,通过 DNS 验证的方式为群晖 NAS 申请 SSL 证书。这个做法的好处在于,不需要修改 NAS 的系统配置,也不需要通过 SSH 登录到 NAS 的命令行,便于备份和迁移的同时,没有因为误操作而导致系统损坏的风险。

准备工作

准备 acme.sh 镜像

首先,在套件中心中安装 Container Manager:

安装Container Manager

由于网络原因,需要在 Container Manager 中手动添加一个 Docker 镜像源才能正常使用。在网络上找到一个可用的 Docker 镜像源地址,然后打开 Container Manager,选择左侧的「注册表」,点击上方的「设置」,在设置窗口中点击「添加」,输入镜像源的地址,然后点击「应用」,回到设置窗口中,选中新添加的镜像源,点击「使用」,最后关闭设置窗口:

添加镜像源

在搜索框中搜索 neilpang/acme.sh 镜像。注意由于群晖的搜索机制的原因,正确结果可能出现在非常靠后的位置,需要耐心翻页。找到 neilpang/acme.sh 镜像后,点击上方的下载按钮,标签保持 latest即可:

下载 acme.sh 镜像

准备存储空间

在群晖 NAS 中创建一个文件夹,用以存放 acme.sh 的配置文件和证书文件。推荐单独为了各类 Docker 容器创建一个共享文件夹,然后在其中创建一个 acme-sh 文件夹:

注意:配置文件和证书文件中可能包含敏感信息,因此请不要将其放在公共可访问的位置!

准备存储空间

申请 SSL 证书

做完上述准备工作后,我们就可以开始申请 SSL 证书了。申请证书的全过程都在 Docker 容器的命令行中进行。

创建 acme.sh 容器

在 Container Manager 中,点击左侧的「映像」,找到 neilpang/acme.sh 镜像,选中之后点击上方的「运行」:

创建容器-0

在弹出的向导中,填写容器的名称,并且勾选「启用自动重新启动」,然后点击「下一步」:

创建容器-1

在「高级设置」中,找到「存储空间设置」,点击「添加文件夹」,选择之前创建的 acme-sh 文件夹,右侧填写 /acme.sh,权限保持「读取/写入」:

创建容器-2

向下翻动页面,找到「网络」,将网络模式更改为「host」;找到「执行命令」,在「命令」中填写 daemon,其他设置保持默认,然后点击「下一步」:

创建容器-3

确认设置后,点击「应用」,等待容器启动:

创建容器-4

打开终端

回到 Container Manager 的「容器」页面,找到刚刚创建的 acme.sh 容器,点击上方的「操作」,选择「打开终端机」:

打开终端

在弹出的窗口中,选择「新增」右侧的下拉按钮,点击「通过命令启动」,输入 /bin/sh,然后点击「确定」:

打开sh-0

打开sh-1

点击左侧的 sh,应该能看到一个命令行窗口,以下的操作都在这个窗口中进行:

sh已经打开

注册 ZeroSSL

acme.sh 默认使用 ZeroSSL 作为 ACME 服务商,因此我们需要注册 ZeroSSL。在命令行中执行(注意替换为自己的邮箱地址):

acme.sh --register-account -m myemail@example.com --server zerossl

注册ZeroSSL

如果你已经在 ZeroSSL 的网站上注册过,可以参考 acme.sh 的文档,使用 EAB 绑定。

申请证书

接下来,我们就可以申请证书了。根据你的 DNS 服务商,选择合适的生成 Token 的方式,这里以 Cloudflare 为例。在命令行中执行(注意替换为自己的 Zone ID、Token 和域名):

export CF_Zone_ID="your_zone_id"
export CF_Token="your_token"
acme.sh --issue --dns dns_cf -d your.domain.com

申请证书-0

等待一段时间之后,证书就会生成在 /acme.sh/your.domain.com 目录下,同时证书的相关信息也会输出到命令行中:

申请证书-1

安装证书

最后,我们需要将证书安装到群晖 NAS 上。在命令行中执行(注意替换为自己的群晖用户名和密码,以及域名):

export SYNO_USERNAME="your_synology_username"
export SYNO_PASSWORD="your_synology_password"
acme.sh --deploy -d your.domain.com --deploy-hook synology_dsm

安装证书

至此,我们已经成功为群晖 NAS 申请了 SSL 证书,并且安装到了系统中。完成以上步骤之后,可以在终端机删除掉 sh,但是不要删除 acme.sh 容器,它会定期完成证书的更新工作。

配置证书

在群晖 NAS 的控制面板中,找到「安全性」-「证书」,可以看到刚刚申请的证书已经安装到系统中:

查看证书

点击「设置」,可以将证书应用到 HTTPS 服务中:

应用证书

再次访问服务,可以看到已经使用了新的证书:

成功使用