群晖使用acme.sh申请并部署泛域名证书
作者:UC新闻震惊部
前言
最近把黑群晖升级到了7.0,并且去freenom搞了个免费的tk域名,就想着把ssl证书一并申请了
这样在外网访问时安全性也能有所加强
本次使用阿里的域名解析,理论上适用于dnspond等acme.sh支持的各种域名解析商
修改为相应的配置就行
首先去freenom后台修改nameserver为阿里的NS1.ALIDNS.COM
如果你是阿里的域名就略过
然后尝试去申请泛域名证书,使用Lets encrypt 的免费证书,有效期大约3个月
本机自带的证书申请貌似需要开放80或443,基本申请时不能通过的,pass
使用acme.sh工具申请
本机安装申请
由于群晖系统本身也是一个linux,acme.sh就是一个脚本,所以可以直接部署申请
经过一番查找,实际上已经有人在群晖上实现过证书部署的脚本
在git上搜索 andyzhshg/syno-acme 就能看到
不过看了下最后提交在2020年了,实际上有些已经不太适用了,本机测试申请是失败的
查看了下issue,有大佬已经提供了解决方案
解决方案在Issue 77
这个脚本的流程大概如下
下载acme.sh-->根据配置吃用acme.sh获取证书-->拷贝证书到群晖对应的目录-->重启web服务
不过在查询资料时意外发现群晖已经提供了api将证书文件导入(没找到最低支持版本,7.0可以),acme.sh也支持这一方案,(两步验证开启情况下需要额外配置,目前不适用,建议使用该脚本时暂时关闭)
所以我综合了issue里面的大佬的方案,简单修改了下脚本,使脚本跑了起来
主要是添加了acme.sh的版本判断,使用api导入证书,且尽量使用群晖界面操作,降低难度
包括一个config配置文件和cert-up.sh 脚本
首先,文本方式编辑打开config,根据自己的实际信息修改配置文件,建议使用文本编辑器或在群晖中用text editor修改,避免编码错误
在群晖建立文件夹,拷贝这两个文件进去,如图,路径随便,我是放在shell-acme中
然后在cert-up.sh处右键查看属性
找到该脚本真实位置
如图,我的这个是/volume1/shell/acme/cert-up.sh
接着使用自带的定时任务
设置-->任务计划-->新增定时任务-->计划的任务-->用户自定义脚本
名称自己定义(不能有中文),用户选择root
因为证书有效时间一般90天,计划选择每月重复
任务设置处添加如下命令,注意各命令间的空格
bash/volume1/shell/acme/cert-up.shupdate >>/volume1/shell/acme/log.txt2>&1
加粗部分为脚本实际路径,后面为日志路径,我放在同目录的log.txt中
根据你自己的脚本位置替换sh路径及日志路径前部分
这个命令会在脚本当前目录生成日志方便排查
注意没有换行,换行效果是群晖自己显示的
确定会提示危险信息,确定即可
完成之后直接右键执行一次,再到对应目录查看日志
稍等即可看到文件夹里多了一些东西
该脚本会首先下载acme.sh然后根据config配置申请证书,最后通过群晖自己的webhook注入并替换默认证书
注意日志会在此处卡2分钟左右
Sleep 120 seconds for the txt records to take effect
耐心等待,
无异常如图
成功后申请到了证书
默认证书会被替换
若想恢复原证书
证书-高级设置-重置证书即可
若选择新增证书的话可能需要重启web服务并手动修改证书使用范围,然后重启web服务
然后刷新应该就可以看到正式应用成功了
使用docker申请
acme.sh是个很绿色的脚本,不会在其他目录生成额外的文件,不会修改其他设置
不过对于我来说更喜欢使用docker,scme.sh也提供了docker安装,由于可以使用群晖提供的webhook,
我们得以更方便的使用docker来下载并导入证书
花了一点时间研究,使用docker也实现了同样的功能,感觉也更简洁点
docker方式本质上与本机安装没什么区别,只是把acme.sh放容器里了,对群晖影响更小
首先docker搜索 acme.sh并安装
下载完成后创建docker
注意容器名,因为后续需要使用docker命令行,所以需保证一致
这里使用acme.sh
映射文件夹,根据自己需要创建文件夹保存acme.sh脚本及证书信息
网络使用host
添加环境变量
参数名与之前的配置文件中的含义一致,大概解释下
Ali_Key和Ali_Secret 为阿里ddns的相关key与秘钥,其他服务商为对应的配置
例如你使用dnspond 则应该为 DP_Id和DP_Key,具体参数可参照配置文件或acme.sh官方文档
SYNO_Username和SYNO_Password 为群晖的用户名及密码
SYNO_Port 群晖的访问端口,http的默认为5000,如果你改动过就用改过之后的
SYNO_Certificate 要添加的证书的名字,空字符串("")的话就是替代默认证书,一般建议使用空字符串,除非你有多个证书
SYNO_Create 证书名不存在就自动创建,当SYNO_Certificate 不为""时需要(我这里没有添加)
添加命令,以守护方式运行,方便使用命令
然后启动这个容器
复制cert-up-docker.sh 到群晖指定文件夹中,内容如图
这个脚本做了两件事,利用acme.sh的docker容器执行申请证书与安装证书命令
即最后两行
修改DOMAIN 为自己的域名即可
我使用阿里的dns,使用其他的服务商修改为相应的,并且在创建docker时加入相应的环境变量
然后重复之前添加自定义计划的步骤,
拷贝cert-up-docker.sh到指定目录-->添加任务计划(root用户,每月一次)-->添加命令-->保存-->运行
命令如下
bash/volume1/shell/acme2/cert-up-docker.sh>>/volume1/shell/acme2/log.txt2>&1
注意替换加粗为你的脚本和日志实际位置,运行即可
总结
这次的脚本在群晖7.0下测试使用通过,出现异常时可查看对应的log.txt,一般会有错误信息
根据错误日志排除即可
同时注意lets encrypt有申请次数限制