群晖部署并自动更新ZeroSSL证书

从群晖控制面板里面的证书,可以看到群晖默认自带的是自签名的证书,这种证书在使用的过程中,通常不被浏览器和App信任,所以我们一般需要使用被信任的第三方证书。
群晖也有自带 Let‘s Encrypt 证书申请功能,但是这个需要验证Nas的80端口,对于我们这些没有公网端口的家庭Nas来说,想实现端口校验几乎不可能,参考之前在小内存NAT VPS安装v2ray的经验,我们可以使用 acme.sh 脚本自动部署,并结合群晖的计划任务功能,实现定期更新。

背景介绍

先说明下我当前的环境:

准备Cloudflare的API Key和Zone ID

Cloudflare 的 API key 的位置可以点击右上角头像 [Profile] → 进入 [My Profile] 页面 → 点击左侧 [API Tokens] → 然后点击 [Create Token] 按钮即可创建。
Cloudflare 的 Zone ID 的位置可以直接在你的域名主页,查看右侧下方的 [Zone ID] 下的一串字符即是。

部署 acme.sh 脚本

使用你的账号,ssh登录到你的Nas主机,然后使用 'sudo -i' 切换到root用户。
下载 acme.sh 到Nas,[email protected] 替换为你申请域名时所填写的邮箱,不要直接复制。另外群晖需要增加 --force 参数运行:

curl https://get.acme.sh | sh -s [email protected] --force

如果curl 指令不存在,还可以使用wget,实际上是一样的:

wget -O -  https://get.acme.sh | sh -s [email protected] --force

脚本会将 acme.sh 下载到当前用户目录下,也就是 ~/.acme.sh 目录, 可使用以下方式切换到该目录:

cd ~/.acme.sh

使用增加 DNS TXT记录的方式申请证书

我前面也提到了没有80端口的局限性,所以此方式需要用到上边我们预先准备好的 Cloudflare Key 和 Zone ID,请确保当前我们处于 ~/.acme.sh 路径下,为了方便更新证书,我们新建 fetch.sh 执行文件:

touch fetch.sh

将以下内容放到该文件中,记得修改相应的地方为你自己的内容:

cd /path/to/.acme.sh
export CF_Key="替换成上边你保存的 KEY"
export CF_Email=" 替换成你申请域名的时候所填写的邮箱"
export CF_Zone_ID="替换成你的域名所在的 Zone ID"
./acme.sh --issue --dns dns_cf -d 你的域名地址 -d '*.你的域名地址'

编辑好之后,再给这个脚本添加执行权限,然后执行脚本开始申请证书:

chmod a+x ./acme.sh
sh ./fetch.sh

如果你看到“Cert success”字样,那你应该已经拿到了证书了。

群晖使用hook方式安装证书

acme.sh 脚本有针对群里添加hook方式来支持安装证书,我们直接使用即可,同样我们可以新建一个 install.sh 脚本来方便安装证书:

touch install.sh

将以下内容放到该文件中,记得修改相应的地方为你自己的内容:

cd /path/to/.acme.sh
export SYNO_Username='群晖管理员用户名'
export SYNO_Password='群晖管理员密码'
export SYNO_Certificate="证书名称"
export SYNO_DID='设备ID'
export SYNO_Create=1
./acme.sh --deploy --deploy-hook synology_dsm -d 你的域名地址 -d '*.你的域名地址'

需要注意下,设备 ID 那里,如果你没开管理员的两步验证,就无需填写,直接删除这一行即可。如果你开了两步验证,这里就需要一点点操作:
a. 打开浏览器,使用管理员账号登陆你的群晖,登录的时候勾选“记住这台设备”;
b. 按 F12 开启调试模式,这个时候会弹出来一个新的界面;
c. 上方一横排菜单里,找到 Application,如果找不到,就把这个窗口拉宽一点儿;
d. 在左侧的 Cookies 菜单点击下方的地址,右侧就会出现很多项内容,找到 ID,把右边的值复制出来;
e. 放到上方的”群晖设备ID“处替换即可

群晖使用任务计划自动更新证书

由于群晖不具备运行 crontab 功能,所以需要自己到定时任务管理系统去设置,实际上只需要运行两个脚本:fetch.sh 获取下新的证书,install.sh 把证书安装到服务器即可。

sh /root/.acme.sh/fetch.sh
sh /root/.acme.sh/install.sh

标签:HTTPS, 群晖, ZeroSSL