1987WEB视界-分享互联网热门产品和行业

您现在的位置是:首页 > 域名 > 正文

域名

群晖使用acme.sh申请并部署泛域名证书

1987web2022-09-01域名439
作者:UC新闻震惊部

作者: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有申请次数限制