通过 Docker 为群晖申请 SSL 证书,并设置自动更新

2023-09-19

介绍

  • acme.sh:自动申请和更新证书的工具
  • Cloudflare:域名解析和托管平台(其中之一服务)
  • Let’s Encrypt:免费的证书颁发机构(有效期三个月)

准备

申请 Cloudflare Token

因为要对域名进行验证,需要先申请有编辑对应域名 DNS 权限的 Token:

  1. 用户 API 令牌 处点击创建令牌
  2. 选择编辑区域 DNS 处点击使用模板
  3. 之后在区域资源选择要申请证书的域名
  4. 保存

开启群晖 SSH 登录

登录群晖 Web,进入控制面板 -> 终端机和 SNMP,勾选启动 SSH 功能后保存。

注:另一种方案是直接通过群晖的任务计划执行每一个操作。

证书申请

以下操作是在成功通过 ssh 连接群晖的情况下执行,每个操作前

export 变量只要执行过一次即可,无须重复运行,在代码中显示只是为了更加直观。

默认情况下群晖的的账号没有加入 Docker 组,因此先切换到 root 账号方便操作,当然也可以为每个命令加 sudo 前缀执行,下面以切换到 root 账号为例子:

Terminal window
1
sudo -i

然后创建存放域名证书的文件夹:

Terminal window
1
mkdir -p /volume1/docker/acme.sh

注册 ACME 账号

Terminal window
1
export ACMEPATH="/volume1/docker/acme.sh" # 上一步创建的路径
2
export EMAIL="[email protected]" # 用于注册 letsencrypt 的邮箱
3
4
docker run --rm \
5
-v "${ACMEPATH}":/acme.sh \
6
--net=host \
7
neilpang/acme.sh \
8
--register-account \
9
-m "${EMAIL}" \
10
--server letsencrypt
  • —rm:表示容器用完后立即销毁
  • —server:指定

申请证书

Terminal window
1
export ACMEPATH="/volume1/docker/acme.sh"
2
export DOMAIN="immwind.com"
3
export CFTOKEN="Gl8exdSXRRwGxg5EjVnTDzYY42" # Cloudflare 申请的 Token
4
5
docker run --rm \
6
-v "${ACMEPATH}":/acme.sh \
7
-e CF_Token="${CFTOKEN}" \
8
--net=host \
9
neilpang/acme.sh \
10
--issue \
11
--dns dns_cf \
12
--ocsp \
13
--server letsencrypt \
14
-d "${DOMAIN}" \
15
-d "*.${DOMAIN}"

CFTOKEN 变量处填入 申请 Cloudflare Token 获取的 Token。

上面三个步骤第一次增加域名的时候需要执行。

部署证书

Terminal window
1
export ACMEPATH="/volume1/docker/acme.sh"
2
export DOMAIN="immwind.com"
3
export USERNAME="username" # 群晖登录账号
4
export PASSWORD="password" # 群晖登录密码
5
export PORT="5001" # HTTPS 端口
6
export SYNO_CREATE=1. # 如果证书不存在,则创建
7
8
docker run --rm \
9
-v "${ACMEPATH}":/acme.sh \
10
-e SYNO_Username="${USERNAME}" \
11
-e SYNO_Password="${PASSWORD}" \
12
-e SYNO_Scheme="https" \
13
-e SYNO_Port="${PORT}" \
14
-e SYNO_Certificate="A different certificate" \
15
--net=host \
16
neilpang/acme.sh \
17
--deploy --insecure \
18
--deploy-hook synology_dsm \
19
-d "${DOMAIN}" -d "*.${DOMAIN}"
  • SYNO_Certificate:是群晖证书界面对应域名下方的说明

部署完成后就可以在控制面板 -> 安全性 -> 证书处看到申请的域名证书,并进行设置。

自动更新证书配置

登录群晖 Web 后,进入控制面板:

  1. 选择任务计划
  2. 新增 -> 计划的任务 -> 用户定义的脚本
  3. 在任务设置 -> 运行命令部分填入下方内容(包括变量)
Terminal window
1
export ACMEPATH="/volume1/docker/acme.sh"
2
export DOMAIN="immwind.com"
3
export CFTOKEN="Gl8exdSXRRwGxg5EjVnTDzYY42"
4
5
export USERNAME="username" # 群晖登录账号
6
export PASSWORD="password" # 群晖登录密码
7
export PORT="5001" # HTTPS 端口
8
9
docker run --rm \
10
-v "${ACMEPATH}":/acme.sh \
11
-e CF_Token="${CFTOKEN}" \
12
--net=host \
13
neilpang/acme.sh \
14
--renew --force \
15
--dns dns_cf \
16
--ocsp \
17
--server letsencrypt \
18
-d "${DOMAIN}" -d "*.${DOMAIN}"
19
20
docker run --rm \
21
-v "${ACMEPATH}":/acme.sh \
22
-e SYNO_Username="${USERNAME}" \
23
-e SYNO_Password="${PASSWORD}" \
24
-e SYNO_Scheme="https" \
25
-e SYNO_Port="${PORT}" \
26
-e SYNO_Certificate="A different certificate" \
27
--net=host \
28
neilpang/acme.sh \
29
--deploy --insecure \
30
--deploy-hook synology_dsm \
31
-d "${DOMAIN}" -d "*.${DOMAIN}"

任务可以每月执行一次,不过为了确保任务正常运行,可以先手动执行一次看是否成功。

最后

配置完后,突然想起 ESXi 的证书也过期了许久,是不是也可以折腾下。

信息

环境

  • DSM 7.2
  • Docker 20.10.23

参考