【HomeLab】2023年!使用acme为群晖NAS自动部署证书
之前一直是用的阿里云的免费证书,只能单个域名申请,有效期一年。这样每年都需要进行证书更新,最近真的是头秃了。在查阅不少资料后,发现使用acme可以快速满足需求。
acme.sh是一款方便,强大的域名证书申请&续签工具,支持一键申请&持久化续签。其支持HTTP验证和 DNS 两种域名验证方式,并且可同时申请多张单域名,泛域名证书,并自动续签证书和部署到项目。如此强大的工具怎能不试试。
最终自己根据场景,选择自动化方案如下,通过阿里云AK,自动化添加TXT记录,进行域名解析校验。进而生成SSL证书进行部署。
NAS为内网环境,无公网IP,故PASS掉HTTP方案。acme支持群晖自动部署,其使用登录脚本,进而调用群晖API进行证书部署。
一、 阿里云AK/SK生成
首先需要先申请AK/SK,在这里需要注意一下最小化权限。我们采用子账号授权来进行
打开阿里云子账户页面 https://ram.console.aliyun.com/users 用户授权,添加对域名解析的访问权限 生成AK/SK
保存好获取到的AccessKey ID以及AccessKey Secret,在后面步骤中会用到。
二、 群晖账号生成
同样,为了便于账号区分,在这里我新建了一个acme账号,授予Administrator权限。(最小化权限失败) 一方面是省的关闭自己使用账号的二次认证,另一方面也是以便后面进行日志审计。
控制面板->用户与群组->用户账号->新建
然后一路下一步即可。
三、 Docker部署
通过docker-compose部署即可,相关脚本如下
目录结构
# 目录结构
.
|docker-compose.yml
|main
| |domain.list
| |add_domain.sh
| |init_domain.sh
| |start.sh
docker-compose.yml
# docker-compose.yml
version: '3'
services:
acme-service:
image: neilpang/acme.sh
container_name: acme
volumes:
- ./data:/acme.sh
- ./main:/root/main
environment:
- Ali_Key= # 第一步获取到的AccessKey ID
- Ali_Secret= # 第一步获取到的AccessKey Secret
- SYNO_Hostname= # NAS登录的IP、或者HOST
- SYNO_Scheme= # NAS登录协议,建议HTTP,免得HTTPS过期产生问题
- SYNO_Port= # NAS登录端口
- SYNO_Username= # NAS账号,建议使用新建账户账号
- SYNO_Password= # NAS密码,建议使用新建账户密码
tty: true
command: daemon
start.sh
#!/bin/sh
# start.sh
DOMAIN=$1
export SYNO_Certificate=$DOMAIN
export SYNO_Create=$DOMAIN
# DNS类型,dns_ali dns_dp dns_gd dns_aws dns_linode根据域名服务商而定,我使用阿里
DNS='dns_ali'
DNS_SLEEP=20
# 证书服务商,zerossl 和 letsencrypt,我使用letsencrypt
CERT_SERVER='letsencrypt'
generateCrtCommand="acme.sh --force --log --issue --server ${CERT_SERVER} --dns ${DNS} --dnssleep ${DNS_SLEEP} -d "${DOMAIN}""
installCrtCommand="acme.sh --deploy -d "${DOMAIN}" --deploy-hook synology_dsm"
$generateCrtCommand
$installCrtCommand
init_domain.sh
#!/bin/sh
# 循环本地domain.list,并且进行证书部署
for line in `cat /root/main/domain.list`
do
DOMAIN=$line
sh /root/main/start.sh $DOMAIN
echo "[+] $DOMAIN is over.. Please wait...."
sleep 10
done
domain.list
*.hello.com
*.test.cn
add_domain.sh
#!/bin/sh
DOMAIN=$1
echo $DOMAIN >> domain.list
sh /root/main/start.sh $DOMAIN
echo "[+] Add $DOMAIN success!"
启动时,在domain.list中填写需要部署的域名即可,然后运行命令。
docker-compose up -d
docker exec acme sh /root/main/init_domain.sh
后续如果还要增加域名可以直接运行如下命令即可。
docker exec acme sh /root/main/add_domain.sh abc.hello.com
注:虽然每次申请为90天,但acme默认会有自动部署检测,所以只要docker正常运行,我们没必要再去进行额外操作。
注2:SSH使用完记得关闭。
代码下载:https://download..net/download/qq_25924971/87405350
四、 安全加固-监控acme账号登录
TODO:好像群晖没有类似账号登录提示的功能,待进一步查看。
参考资料
【SMZDM】群晖使用acme申请泛域名证书并设置自动证书部署【SMZDM】群晖使用acme.sh申请并部署泛域名证书【思有云 - IOIOX】自动化部署证书 acme.sh 详细实践使用教程