使用 acme.sh 和 ZeroSSL 自动更新群晖的 HTTPS/SSL 证书

通过这个网址注册并生成凭证:

https://app.zerossl.com/developer

/zh-cn/auto-renew-zerossl-in-synology/ZeroSSL_EAB.webp

创建一个文件夹,路径为: /volume1/docker/acme

将脚本放在这个文件夹里,并将脚本文件命名为 my_update_ssl.sh.

/zh-cn/auto-renew-zerossl-in-synology/docker_files.png

注意:

  • 我是用 5001 作为我的 NAS 的 HTTPS 登录端口,你可以根据自己情况进行修改
  • 我还在脚本里加入了把证书部署到路由器的代码,只是作为练手使用。为了实现这个目的,我把 .ssh 目录挂载到 docker 里以便使用 SSH 密钥。 如果你不需要的话可以删除 -v “${ACME_VOLUME}/.ssh”:/root/.ssh 这一行以及忽略第五步
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#! /bin/bash

export ACME_VOLUME=/volume1/docker/acme
export DOMAIN=你的域名.com

echo ">>>>>>> Ken: ==== SSL 更新开始 ===="

echo ">>>>>>> Ken: 1) 准备运行 acme.sh ..."

docker run --rm  -itd  \
  -v "${ACME_VOLUME}":/acme.sh  \
  -v "${ACME_VOLUME}/.ssh":/root/.ssh \
  --net=host \
  --name=acme.sh \
  neilpang/acme.sh daemon

echo ">>>>>>> Ken: 2) 注册 ZeroSSL 账号"

docker exec acme.sh \
--register-account --server zerossl --eab-kid "YOUR_EAB_KID" --eab-hmac-key "YOUR_EAB_HMAC_KEY"

echo ">>>>>>> Ken: 3) 生成证书"

docker exec \
-e CF_Token="你的_CLOUDFLARE_TOKEN" \
-e CF_Email="你的EMAIL" \
acme.sh \
--issue --dns dns_cf --dnssleep 60 -d "${DOMAIN}" -d "*.${DOMAIN}" --server zerossl

echo ">>>>>>> Ken: 4) 部署证书"

# 为了查看 SYNO_DID 这个 cookie 的内日,可在 Edge 浏览器打开这个页面(假设你的 NAS 登录地址是 192.168.1.200):
# edge://settings/cookies/detail?site=192.168.1.200

docker exec \
-e SYNO_Username="你的NAS用户名" \
-e SYNO_Password="你的NAS密码" \
-e SYNO_Certificate="" \
-e SYNO_Scheme="https" \
-e SYNO_Port="5001" \
-e SYNO_DID='你的NAS的DID(如果使用了二步验证才需要)' \
acme.sh \
--deploy --insecure -d "${DOMAIN}" -d "*.${DOMAIN}" \
--deploy-hook synology_dsm

echo ">>>>>>> Ken: 5) 把证书部署到 OpenWrt 路由器(不需要的话删除这一段)"

docker exec \
-e DEPLOY_SSH_USER="root" \
-e DEPLOY_SSH_SERVER="router" \
-e DEPLOY_SSH_KEYFILE="/etc/uhttpd.key" \
-e DEPLOY_SSH_CERTFILE="/etc/uhttpd.crt" \
-e DEPLOY_SSH_BACKUP=yes \
-e DEPLOY_SSH_BACKUP_PATH="/etc/uhttpd_crt_bk/" \
-e DEPLOY_SSH_REMOTE_CMD="service uhttpd restart" \
acme.sh \
--deploy -d "${DOMAIN}" -d "*.${DOMAIN}" \
--deploy-hook ssh

echo ">>>>>>> Ken: 正在停止 acme.sh"

docker stop acme.sh

echo ">>>>>>> Ken: #### SSL 更新结束 ####"

为了能通过 SSH 连接到路由器,我还做了这些准备:

  • 生成 SSH 密钥对 id_rsa_dsm2router 并且不带密码

  • 把 SSH 密钥放到 /volume1/docker/acme/.ssh 文件夹

  • 使用上面 docker run –rm … 的脚本运行 docker,然后

    1
    
    docker exec -it acme.sh sh
    

    接着进入 docker 的 shell,执行:

    1
    
    ssh-add ~/.ssh/id_rsa_dsm2router
    

    我还添加了这个配置文件:

    1
    2
    3
    4
    5
    
    Host router
    	HostName 192.168.1.100
        User root
        Port 10022
    	IdentityFile ~/.ssh/id_rsa_dsm2router
    

    最终的文件结构如下:

    /zh-cn/auto-renew-zerossl-in-synology/acme_ssh.png

如果群晖使用了二步验证,则需要通过浏览器获得 SYNO_DID 这个 cookie:

https://github.com/acmesh-official/acme.sh/wiki/Synology-NAS-Guide#deploy-the-default-certificate

关于使用 SSH 部署 acme.sh:

https://github.com/acmesh-official/acme.sh/wiki/deployhooks#examples-using-ssh-deploy

关于装了 OpenWrt 的路由器的 uHTTPd 配置:

https://openwrt.org/docs/guide-user/services/webserver/uhttpd

打开 控制面板, 任务计划,新增一个 计划的任务/用户定义的脚本

命名为 acme,用户账号设置为 root

计划页面,设置成 每月重复

任务设置页面,底部的用户定义的脚本区域输入下面的代码:

1
bash /volume1/docker/acme/my_update_ssl.sh >>/volume1/docker/acme/log_acme/log.txt 2>&1

相关内容