优雅地将本地SSL证书部署到群晖

之前提到使用 Nginx Proxy Manager 自动申请证书,但是部署到群晖还需要在 DSM 中操作,下面的脚本可以自动化这一过程。

此教程面向对 docker 有一定了解的用户。

根据脚本前面几行注释,原作者给出的使用方式是使用 SCP 命令把证书文件从另一台主机复制到群晖后,再执行脚本。这里我们不采用这种方法,所有操作都只在群晖这一台主机上进行。

首先把脚本下载到群晖任意目录,这里假设脚本的绝对路径为 /volume1/scripts/replace_synology_ssl_certs.sh

红框内为文件的绝对路径

然后找到 NPM 生成的证书,一般在容器内的 /etc/letsencrypt/archive/npm-1 中。

如果你已经申请了证书,并且没有映射这个路径,请把此文件夹从容器内复制到宿主机,然后再添加映射记录。切记不要直接把空文件夹映射到容器,这样做会让空文件夹覆盖此路径,造成文件丢失。

同样通过以上的方法获取证书文件绝对路径,这里假设证书的绝对路径为 /volume1/certificates ,文件夹中应有 cert1.pem chain1.pem fullchain.pem privkey1.pem 四个文件,我们只需使用其中三个。

在群晖 DSM 中点击 控制面板-任务计划-新增-计划的任务-用户定义的脚本任务名称 随便填一个,用户账号 选择 root,计划 选择每月重复。

将以下代码复制到 任务设置-运行命令 中,注意将路径改成你自己的:

cp -f /volume1/certificates/privkey?.pem /tmp/privkey.pem \
&& cp -f /volume1/certificates/fullchain?.pem /tmp/fullchain.pem \
&& cp -f /volume1/certificates/cert?.pem /tmp/cert.pem \
&& sudo /volume1/scripts/replace_synology_ssl_certs.sh

前三个 cp 命令是将证书文件复制到 /tmp 路径中并重命名删掉文件名里的数字,第四个 sudo 是以 root 身份执行脚本,脚本完成后会自行重启网页服务。

此时证书已经成功替换。

2024.5.14 更新

要注意的是,WebStation 等套件需要重启才能应用更新的证书,在脚本的第38行填入套件名称即可,套件名称可通过 ssh 命令 ls /var/packages/ 查询。

PACKAGES_TO_RESTART=("WebStation")