群晖使用acme申请泛域名证书并设置自动证书部署

主要内容

通过群晖docker中的acme映像,实现自动证书获取并登录群晖将证书进行替换;

同时本文只提供在阿里云解析的域名教程,CloudFlare应该也可以实现,不过我试了很久,总是提示api有问题,所以转到了阿里云;如果有大佬知道cfapi设置方法的可以告知一下。

文章分为以下部分:

  1. 获取阿里云api;

  2. 群晖二次验证did获取;

  3. docker版acme安装及设置;

  4. 自动部署脚本及定时任务的设置。

1.阿里云api申请

(1)登录阿里云,进入控制台后,移动到右上角的头像,选中AccessKey 管理;

(2)进入AccessKey 管理后,点击创建AccessKey,通过验证后会获得“AccessKey ID” 与 “AccessKey Secret”;保存好这两串字符备用。

2.群晖二次验证did获取

如果群晖开了二次验证需要获取一个did,没开的小伙伴直接跳到第3步;群晖使用acme申请泛域名证书并设置自动证书部署

通过内网登录群晖以后,以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)自动脚步获取

#!/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/