群晖DSM7使用acme.sh自动申请和续签ECC泛域名证书

群晖在国内无法使用自带的证书管理程序自动申请和续签证书,因此往往需要一些额外的方式。当前最为主流的替代方法是使用最为流行的acme.sh管理证书。之前国内的教程都倾向于以类似传统linux服务器中的acme.sh安装和配置方法管理证书。但是acme.sh官方其实为群晖系统进行了适配,其可以使用一个hook调动群晖自身的证书管理系统安装证书。

 · 阅读量: 

群晖在国内无法使用自带的证书管理程序自动申请和续签证书,因此往往需要一些额外的方式。当前最为主流的替代方法是使用最为流行的acme.sh管理证书。

之前国内的教程都倾向于以类似传统linux服务器中的acme.sh安装和配置方法管理证书。但是acme.sh官方其实为群晖系统进行了适配,其可以使用一个hook调动群晖自身的证书管理系统安装证书。

对应的安装指导在如下链接:Synology NAS 指南 ·acmesh-official/acme.sh 维基,结合我自己的安装实践和踩坑教训,对其进行翻译。

群晖安装acme.sh自动管理ECC泛域名证书

这里以虚拟域名千度(现场编一个) qiandu.com为例,为其申请泛域名证书,并且使用ecc证书

参考官方 Synology NAS 指南 ·acmesh-official/acme.sh 维基

1 登录群晖

首先,在群晖 控制面板 > 终端机与SNMP 中在终端机页面启动SSH功能

然后,使用SSH工具登录群晖的管理员账户,我这里使用的是xshell,你可以使用任意你喜欢的SSH工具。

2 安装 acme.sh/usr/local/share/acme.sh

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 使用管理员用户登录后,立即切换到root用户,这里需要输入管理员的密码
sudo su
# 然后进入 root用户的home目录
cd ~
# 接下来下载 acme.sh 压缩包、解压并安装到 /usr/local/share/acme.sh
wget https://github.com/acmesh-official/acme.sh/archive/master.tar.gz
# 解压
tar xvf master.tar.gz
# 进入解压目录
cd acme.sh-master/
# 安装到/usr/local/share/acme.sh目录,下面的邮箱是可选项,证书快过期时对应的证书颁发机构可能会发邮件提醒你
./acme.sh --install --nocron --home /usr/local/share/acme.sh --accountemail "email@gmail.com"
# 安装完毕后,更新一下登录预操作脚本
source ~/.profile

3 配置 DNS 环境变量

由于普通家庭网络无法使用http的80端口验证其对域名的持有权,所以这里使用DNS的方式进行验证。这里需要你去对应的DNS服务商创建一个可以添加域名记录的令牌。这个令牌在不同的服务商有不同的叫法,具体参考官方手册DNS API指南

我使用的的阿里云的DNS服务,其对应需要变量Ali_KeyAli_Secret

1
2
3
# 在阿里云上记录你的key和secret
export Ali_Key="xxxxxxxxxxxxxxxxxxx"
export Ali_Secret="yyyyyyyyyyyyyyyyyyyyyyy"

如果你使用的是其它DNS服务商,请参考官方手册DNS API指南

4 申请泛域名ECC证书

这里进入acme.sh的安装目录。使用acme.sh 的 issue 子命令向证书服务商(这里使用letsencrypt,其免费提供有效期为3个月的证书)申请一个证书。我个人喜欢ecc证书,所以下面申请ecc的泛域名证书

1
2
3
4
5
6
# 进入acme.sh的安装目录
cd /usr/local/share/acme.sh
# 为主域名qiandu.com和泛域名*.qiandu.com从阿里DNS服务(--dns dns_ali)验证申请 ecc-256算法的证书(下面的-k参数ec-256)
./acme.sh --issue --server letsencrypt --home . -d qiandu.com -d *.qiandu.com --dns dns_ali -k ec-256
# 如果你喜欢普通的RSA证书,例如RSA2048证书(-k 2048)
./acme.sh --issue --server letsencrypt --home . -d qiandu.com -d *.qiandu.com --dns dns_ali -k 2048

5 安装证书/部署证书

官方提供了几种不同的安装方法,这里使用官方最为推荐的临时管理员方式。

注意:证书描述是可选的,忽略该参数而安装的证书其证书描述为空。下面的证书续订依赖于这个证书描述,因此建议设置一个描述,且在部署完证书后千万不要在群晖控制面板中更改刚刚安装的证书的描述。证书续订过程需要根据证书描述定位并验证acme.sh安装的证书,更改证书描述会导致证书续订过程无法找到对应描述的证书而续订失败。

1
2
3
4
5
6
7
8
# 指示使用临时管理员
export SYNO_USE_TEMP_ADMIN=1
# 设置证书描述(你可以随意设置,只要不重复即可,建议使用域名作为描述,例如下面的 qiandu.com_ecc)
export SYNO_CERTIFICATE="qiandu.com_ecc"
# 如果证书不存在,则自动创建
export SYNO_CREATE=1
# 这里通过证书对应的域名qiandu.com指明所要部署到群晖中的证书,这里的泛域名证书只需要主域名就可以。别忘了替换下面的qiandu.com为你的域名
./acme.sh --deploy --home . -d qiandu.com --deploy-hook synology_dsm

根据官方所述的翻译

这样,您就不需要提供任何管理员凭证,deploy sciprt 本身会利用 Synology 内置的实用程序来完成身份验证,因此它设计为仅支持本地部署,不能用于在 docker 中部署或远程部署。

6 配置证书续订

这里不要使用cronjob,建议使用群晖面板中的计划任务

要在将来自动续订证书,您需要在任务计划程序中配置任务。不建议将其设置为自定义 cronjob(如本 wiki 页面之前所述),因为 DSM 安全顾问会告诉您有关于未知 cronjob 的严重警告。

打开 控制面板 > 任务计划新增 > 计划的任务 > 用户自定义的脚本,然后创建以下任务

  • 常规:任务名称: Update_defaule_cert;用户账号: root
  • 计划:设置为每周执行或者每月执行,只要小于证书有效期3个月即可
  • 任务设置:使用以下命令脚本:
1
2
# 更新证书
/usr/local/share/acme.sh/acme.sh --cron --home /usr/local/share/acme.sh

注意:该hook会续订通过acme.sh安装的所有证书,其通过证书描述定位由acme安装的证书。请不要在控制面板中更改证书的描述,否则acme无法通过安装时的证书描述定位对应的证书,进而导致证书续订失败。

7 修复 Synology DSM 升级后损坏的环境

当群晖进行系统升级时,会重置系统的环境变量。此时会破坏acme.sh运行所依赖的环境变量。使用以下命令在profile中添加一个修复环境变量的预执行命令

1
./acme.sh --force --upgrade --nocron --home .

或者,或手动将以下行添加到 /root/.profile 中

1
. "/usr/local/share/acme.sh/acme.sh.env"

完成上面的部分后,你就可以退出ssh连接了。然后在群晖控制面板里记得关闭ssh连接,并将你申请部署的新证书设置为新的默认证书

8 结束清理

完成以上配置后,请关闭群晖中的ssh功能。

参考链接

直接安装脚本

Synology NAS 指南 ·acmesh-official/acme.sh 维基

群晖配置acme自动更新群晖和服务器证书 - 任意的Blog

使用docker申请证书

群晖使用acme.sh申请并部署泛域名证书_NAS存储_什么值得买

群晖7.2.1开启二次验证用docker安装acme.sh,实现自动更新部署SSL证书_网络存储_什么值得买

群晖7.2使用ACME.SH更新SSL证书 双重认证 泛域名 DNSPOD_NAS存储_什么值得买

群晖7.2用docker安装acme.sh,实现自动更新部署SSL证书_群晖 acme-CSDN博客

群晖7.2.1开启二次验证用docker安装acme.sh,实现自动更新部署SSL证书_网络存储_什么值得买