目录
1.前言
群晖Quickconnect 的访问速度太慢,很大一批都宁愿自己淘一个低延迟且水管足够的VPS服务器配合群晖NAS来做内网穿透使用,来达到提升外网访问速度的目的。而对于一个暴露在外网的NAS来说,让后台访问支持HTTPS协议变得尤为重要。很多人会说为什么不用群晖Quickconnect 服务,使用DSM系统自带的SSL证书?毕竟 Quickconnect 访问慢啊,另外我们很多时候需要在NAS上建站或者部署安装其他的项目都需要用到泛域名证书。
免费的泛域名证书 ——Let’s Encrypt 一个就搞定,而且还有相应的开源脚本 说明 · acmesh-official/acme.sh Wiki · GitHub 轻松便捷的签发证书,可以申请一个类似 *.domain.com
的单一证书,就可以适配 abc.domain.com
,xyz.domain.com
这类的子域名,而不需要单独为每个子域名申请证书了。
今天的介绍的重点是:如何使用群晖 SSL 自动签发脚本 为你的 群晖 NAS 配置 HTTPS 泛域名证书,并实现证书自动续签。
先看看效果
2.docker版的acme.sh使用
群晖套件中心安装Container Manager 旧版的是docker,新版改了名字。
打开Container Manager 在注册表中搜索acme.sh 下载图中neilpang/acme.sh的镜像
打开file station 在docker目录中新建acme.sh目录,用于存储生成的证书。
在容器中新增镜像,选着我们刚才下载的镜像。
注意要勾选自动重启
配置存储空间,
配置如下的环境
Ali_Key #阿里云的key
Ali_Secret #阿里secret
SYNO_Username #群晖登录用户名
SYNO_Password #群晖后台登录密码
SYNO_Certificate #群晖证书名 填写需要替换的证书名 如果是默认群晖证书填"" 或synology
SYNO_Create #域名证书创建, 填域名
SYNO_Port #群晖后台登录端口号
在命令一行输入 daemon
3.脚本使用
我的域名是阿里云的。
其它域名商请参考 https://github.com/acmesh-official/acme.sh/tree/master/dnsapi
在本地新建文件 , 命名为 cert.sh 粘贴如下代码,并适当修改
#!/bin/bash
# 域名
DOMAIN='填域名'
# # DNS类型,dns_ali dns_dp dns_gd dns_aws dns_linode根据域名服务商而定,CloudFlare就是dns_cf
DNS='dns_ali'
# DNS API 生效等待时间 值(单位:秒),一般120即可
# 某些域名服务商的API生效时间较大,需要将这个值加大(比如900)
DNS_SLEEP=120
# 证书服务商,letsencrypt
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
右键点击该文件属性,复制其位置,后续编写定时脚本需要。
4.编写定时脚本
在任务计划中,新建任务,其中用户账户选择root 不然会因为权限不足而无法执行,出现 下面的docker通信问题。
在计划中填入实行计划,由于一次申请证书有效期是三个月,可以选择每三个月执行一次,当然也可以每个月实行一次。
在运行命令中填入如下脚本,
/volume1/homes/rain/dsm7/cert.sh 为脚本证书 cert.sh 所在位置,
/volume1/homes/rain/dsm7/log/acme/log.txt 为日志写入位置。
bash /volume1/homes/rain/dsm7/cert.sh >> /volume1/homes/rain/dsm7/log/acme/log.txt 2>&1
5.验证
可以看到已经成功获取到了证书,并且已经部署到了群晖dsm中。
6.执行与docker通信的脚本出错问题
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/acme-sh/json": dial unix /var/run/docker.sock: connect: permission denied
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/acme-sh/json": dial unix /var/run/docker.sock: connect: permission denied
原因分析:这是因为你当前的用户没有这个权限。默认情况下,docker 命令会使用 Unix socket
与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket
。出于安全考虑,一般 Linux 系统上不会直接使用 root
用户。即我们当前的用户不是root用户。
解决办法:把我们当前的用户添加到docker组中就可以了,这样他们就是一家人了。
- 方法一
第一步:sudo gpasswd -a username docker #将普通用户username加入到docker组中,username这个字段也可以直接换成$USER。
第二步:newgrp docker #更新docker组
第三步:再执行你报错的命令,此时就不会报错了。
- 方法二 使用超级用户执行,
sudo -i