群晖使用acme申请泛域名证书并设置自动证书部署
主要内容
通过群晖docker中的acme映像,实现自动证书获取并登录群晖将证书进行替换;
同时本文只提供在阿里云解析的域名教程,CloudFlare应该也可以实现,不过我试了很久,总是提示api有问题,所以转到了阿里云;如果有大佬知道cfapi设置方法的可以告知一下。
文章分为以下部分:
获取阿里云api;
群晖二次验证did获取;
docker版acme安装及设置;
自动部署脚本及定时任务的设置。
1.阿里云api申请
(1)登录阿里云,进入控制台后,移动到右上角的头像,选中AccessKey 管理;
(2)进入AccessKey 管理后,点击创建AccessKey,通过验证后会获得“AccessKey ID” 与 “AccessKey Secret”;保存好这两串字符备用。
2.群晖二次验证did获取
如果群晖开了二次验证需要获取一个did,没开的小伙伴直接跳到第3步;
通过内网登录群晖以后,以edge或者chrome浏览器为例,按F12弹出开发者工具,选择“网络”;
按ctrl+r;
刷新完成后在名称中找到与内网群晖ip一致的记录(其实其他记录也会有cookie),选择“标头”,下拉找到"Cookie",在后面的内容中找到 "did" 开头的一串字符,将"did=" 后面所有的字符全部保存好备用(以下简称did);
3.docker版acme安装及设置
(1)在群晖中找到docker,点击注册表,搜索“acme” ,双击neilpang/acme.sh,选择latest下载;
(2)映像下载完毕后,双击neilpang/acme.sh,设置容器名称(这里容器名称设置为”acme“,名称在后面设置中会用到),选择高级设置;
(3)选择存储空间,添加文件夹(我已经在共享文件夹的docker文件夹内新建了一个acme的文件夹,这里映射acme文件夹主要用于存储acme的一些设置,尽管可能不会用到这些设置,但还是建议映射一下,本人也没有测试不映射能不能跑起来。),本地文件夹选择docker下面的acme,映射 /acme.sh
(4)选择网络,勾选使用与 Docker Host 相同的网络;
(5)选择环境,添加如下环境变量;
Ali_Key : 填入第一步获取的 AccessKey ID
Ali_Secret : 填入第一步获取的 AccessKey Secret
SYNO_DID : 填入第二步获取的 DID (没有设置两步验证的忽略)
SYNO_Port : 填入群晖内网的端口号(我用的默认端口5000未修改)
SYNO_Username : 登录群晖的用户名
SYNO_Password : 登录群晖的密码
SYNO_Certificate :要添加的证书的名字,空字符串("")为替换默认证书(我这里使用空字符串)
SYNO_Create : 当SYNO_Certificate 不为("")时,需要设置自动创建的证书名(因为我是替换证书,所以没有设置,第一次设置证书的小伙伴可能会用到。)
(6)环境变量设置完成后,在命令中输入”daemon“,选择应用 → 下一步 → 应用 ; 完成后检查acme是否运行。
4.自动部署脚本及定时任务的设置。
(1)自动脚步获取
自动运行脚本下载,移步 群晖使用acme.sh申请并部署泛域名证书_NAS存储_什么值得买 (smzdm.com) 评论区二楼;
桌面新建 ”文本文档“,将下方内容复制粘贴进新建的文本文档,文本文档另存为 cert-up-docker.sh
#!/bin/bash
# 域名
DOMAIN='xxx.com'
# # DNS类型,dns_ali dns_dp dns_gd dns_aws dns_linode根据域名服务商而定,我使用阿里
DNS='dns_ali'
# DNS API 生效等待时间 值(单位:秒),一般120即可
# 某些域名服务商的API生效时间较大,需要将这个值加大(比如900)
DNS_SLEEP=120
# 证书服务商,zerossl 和 letsencrypt,我使用letsencrypt,使用zerossl还需要注册
CERT_SERVER='letsencrypt'
generateCrtCommand="acme.sh --force --log --issue --server ${CERT_SERVER} --dns ${DNS} --dnssleep ${DNS_SLEEP} -d "${DOMAIN}" -d "*.${DOMAIN}""
installCrtCommand="acme.sh --deploy -d "${DOMAIN}" -d "*.${DOMAIN}" --deploy-hook synology_dsm"
docker exec acme.sh $generateCrtCommand
docker exec acme.sh $installCrtCommand
(2)将自动脚本放到群晖共享文件夹中
我已经在群晖新建了一个名为shell的共享文件夹,在共享文件夹内新建了acme文件夹;
将下载好的 cert-up-docker.sh 上传到shell/acme文件夹;
(3)编辑 cert-up-docker.sh
群晖安装文本编辑器套件,打开套件中心,搜索文本编辑器并安装
找到刚刚上传的 cert-up-docker.sh ,右键 用文本编辑器 打开;
找到 DOMAIN ,将引号内的内容改为自己的域名并保存;
最后两行代码中包含了docker的容器名称,容器名称详见3.(2),将acme修改为你设置的容器名称;
docker exec acme $generateCrtCommand
docker exec acme $installCrtCommand
保存好以后,再次右键 cert-up-docker.sh , 选择”属性“, 将位置保存备用,我的存储位置为”/volume1/shell/acme/cert-up-docker.sh“;
(4)添加任务计划,实现自动更新
打开控制面板,找到任务计划,点击新增,选择计划的任务,选择用户定义的脚本;
在创建任务的常规中,可以修改任务名称;
选择计划,可以设置计划运行的频率,建议设置为每个月运行一次,运行时间也可以自由选择
选择任务设置,在用户定义的脚本中输入:
bash /volume1/shell/acme/cert-up-docker.sh >>/volume1/shell/acme/log.txt 2>&1
其中 /volume1/shell/acme/cert-up-docker.sh 为我的 cert-up-docker.sh 存储位置,获取方式详见4.(3);
/volume1/shell/acme/log.txt 2 为 log文件存放的位置,我放在cert-up-docker.sh同目录下,方便查看日志;
设置完成以后就可以点击确定了;
设置完成以后可以运行一遍,回到任务计划,找到刚刚创建的任务,右键运行;
运行日志可以到设置的存放日志的文件夹中查看;
()
注意:群晖cookie的did经常过期,如果log日志里显示(If two-factor authentication is enabled for the user, set SYNO_Device_ID.),一般都是cookie过期,需要重新更新docker里面的环境变量SYNO_DID =xxxx。
更新后重新启动容器,再重新运行脚本一次即可。
总结
感谢原文作者,骚气的:想你的姑姑。原文地址:https://post.smzdm.com/p/a6d5dl6e/