安装Let's Encrypt泛域名证书实现群晖NAS的免端口安全访问
本帖最后由 waylon 于 2018-3-18 02:56 编辑通过DSM提供的反向代理服务器(Nginx),可以在公网上直接通过https协议不加端口的直接访问NAS服务器的各项服务,一来避开了家中80端口被屏蔽的囧状,二来采用SSL证书强化了NAS系统访问的安全性。
虽然通过IP地址、QuickConnect或者花生壳等DDNS可以实现以上目的,但是毕竟显得不太专业,拥有自己的域名,通过域名来访问NAS是最自然的方式。现在注册一个域名并不是什么难事,费用也不是不可承受,通过CloudXNS或者DNSPOD等支持API的域名服务商,可以实现自己的域名与NAS服务器IP的动态绑定(DDNS),这部分内容并不是本文的主要内容,小白玩家可以自行搜索相关的文章来实现。
拥有了自己的域名(假设为mydomain.site),实现了DDNS,下一步自然是通过反向代理服务器为各项服务配置二级域名的解析,这个过程在DSM的控制面板中的“Synology应用程序门户”中完成,首先是通过“应用程序”中的设置为各项服务启用HTTPS的端口,然后在“反向代理服务器”中配置解析的规则,例如Note Station的端口为9351,则规则中这样配置:
[*]来源协议为:HTTPS
[*]来源主机名为:note.mydomain.site
[*]来源端口为:443
[*]目的地协议为:HTTPS
[*]目的地主机名为:localhost
[*]目的地端口为:9351
通过这种规则,可以建立一系列的二级域名,例如:video.mydomain.site,audio.mydomain.site,drive.mydomain.site,calendar.mydomain.site等等,甚至可以通过router.mydomain.site直接指向自己的路由器的配置页面。
实现了域名解析,下一步是安装SSL证书,否则在浏览器中访问这些域名时会非常尴尬的出现不安全的提示,如果你不缺钱,可以花钱去注册SSL证书,但是互联网上既然存在免费的SSL证书,作为爱折腾的NAS玩家当然要选择后者,而Let's Encrypt证书就是最适合的对象。
以往为了在这么多的NAS二级域名上使用SSL证书,必须每个二级域名进行一次申请,每90天重复一次,虽然有自动化脚本,执行时等待的时间还是很长的,就在本周二的3月13日,Let's Encrypt宣布泛域名证书服务上线,终于可以不再每个域名单独申请,只要申请mydomain.site及*.mydomain.site的证书即可,操作更为简便,使用也可以更为灵活,追加或变更二级域名不再需要重新申请证书了。
下面就将新的泛域名证书申请的方法进行介绍,首先是SSH登录到NAS服务器,然后获取acme.sh的代码并安装,之后就是执行acme.sh来申请证书,最后下载安装证书,由于acme.sh会通过cronjob命令来生成每日检查的任务,而群晖NAS中默认并无cronjob命令,因此必须在安装acme.sh时增加一个“--force”参数来禁止使用cronjob命令,所以虽然acme.sh提供了curl等方法直接安装,但是我还是建议使用Git克隆源码(可在Git Server套件安装后使用git命令)后安装,另外我使用了CloudXNS管理域名,acme.sh具体支持的域名服务商请参见后面的链接。
[*]获取代码
git clone https://github.com/Neilpang/acme.sh.git
[*]安装脚本
cd acme.sh
./acme.sh --install --force
[*]进入目录:
cd ~/.acme.sh/
[*]设置变量:
export CX_Key="替换为CloudXNS的key"
export CX_Secret="替换为CloudXNS的secrcet"
[*]申请证书:
./acme.sh --issue --dns dns_cx -d mydomain.site -d *.mydomain.site
[*]备注,90天以后更新证书时的命令为:
./acme.sh --renew -d mydomain.site -d *.mydomain.site
在等待120秒之后,证书就已经申请下来了,下面接着在NAS中部署证书,上一步中的证书申请时都下载到了~/.acme.sh/mydomain.site/,在DSM的File Station中找到该目录,把私钥、证书、中间证书下载到PC本地,这三个文件分别是私钥:mydomain.site.key、证书:mydomain.site.cer、中间证书:ca.cer,然后在DSM的控制面板中找到安全性,在“证书”中新建证书或替换已有证书,之后选择导入正整数,然后在私钥、证书、中间证书的选项中分别选中刚刚下载的文件,确定之后DSM会重启应用程序门户来应用新的证书。
SSL证书安装好了后,可以在浏览器中用https协议免端口访问一下任意二级域名是否已经变成绿色的小锁了,另外别忘了在访问前,路由器上的443端口必须打开,否则https协议无法连接到服务器上。最后,可以自己做个HTML页面放到www.mydomain.site,把所有的外部服务放到自己的导航主页上,以后使用服务时只要访问主页并点击相应的图标即可。
参考链接:
LE证书支持泛域名的说明
两种安装LE证书的介绍
acme.sh的中文说明
acme.sh的安装说明
acme.sh支持域名服务商的DNS API
我的导航主页
这个是技术文啊!显然我看不懂!!! 本帖最后由 waylon 于 2018-3-18 10:26 编辑
roray 发表于 2018-3-18 09:20
这个是技术文啊!显然我看不懂!!!
也不复杂,跟着配置即可,主要目的就是在浏览器上直接输入 https://note.mydomain.site 时直接访问自己的Note Station,需要处理的几个问题是:
1.宽带IP变化时,域名访问不出错
2.HTTPS访问时,不要出现证书无效的提示
3.证书的生成和更新可以方便的操作,目前由于DSM本身的欠考虑,无法使用DSM本身的LE证书生成和更新功能,因此得用手动方式,希望以后DSM能改进 我有个问题局域网内有一台网页服务器使用了443,群晖上怎么才能共享443端口 好像挺管用的,谢谢分享 不错已经推送到公众号!如果有配图更好! 能不能写一个用DM界面安装证书的教程? 443端口都封了,还有卵用不? waylon 发表于 2018-3-18 10:23
也不复杂,跟着配置即可,主要目的就是在浏览器上直接输入 https://note.mydomain.site 时直接访问自己的N ...
利用DSM本身的LE证书生成和更新功能,需要DSM所在的网络开启80端口;DSM的这个功能是可用的。
无奈的是目前家庭用的宽带基本都是封了80端口的。 hnmcc1860 发表于 2018-3-18 10:32
我有个问题局域网内有一台网页服务器使用了443,群晖上怎么才能共享443端口 ...
反向代理的话,来源端口全部都是443,只是不同的服务目的地端口不一样,你这个只要保持原来的网页的目的地端口为443即可,不会冲突的 tomshen 发表于 2018-3-18 11:41
能不能写一个用DM界面安装证书的教程?
DM界面安装证书只要把生成的证书选择上去即可,没有啥需要特别写的吧 觅凤的梧桐 发表于 2018-3-18 14:05
443端口都封了,还有卵用不?
没有吧,至少我这的443端口还是可以正常访问的,当然,天朝的事都说不清,说不定什么时候就全面封锁了443了 超导体 发表于 2018-3-18 17:56
利用DSM本身的LE证书生成和更新功能,需要DSM所在的网络开启80端口;DSM的这个功能是可用的。
无奈的是目 ...
就是这个意思啊,因为从Synology的角度,用80端口是很正常的,但是国内家庭宽带的80都被阉割了,所以DSM本身的LE功能无法使用,但是毕竟大陆的销量摆在这里,Synology应该要适应一下啊,所以我说DSM欠考虑
Synology的论坛上早就有请求支持DNS认证方式的帖子,但是官方没有任何响应。 momo 发表于 2018-3-18 11:03
不错已经推送到公众号!如果有配图更好!
大部分都是终端中的操作,好像配图的必要性不大,所以没有准备图片{:7_204:} 谢谢分享 说的好像443没有被封禁一样的。 xwf112 发表于 2018-3-19 11:16
说的好像443没有被封禁一样的。
哈哈,我这里的确没有封禁,你是哪个地方的? xwf112 发表于 2018-3-19 11:16
说的好像443没有被封禁一样的。
无论是否使用443端口,DSM通过反向代理服务器自己解析二级域名的方法都是通用的,这种方法不用在域名注册商那边配置二级域名的解析,在DSM中管理这些解析比较方便。
如果443真的被封了,那就只有靠外部VPS再加一层反代了,VPS的反向代理服务器把443端口的请求转到DSM指定的端口,例如20443,DSM中的反向代理服务器中的来源端口改为20443即可,甚至在路由器的防火墙上将外部20443端口转发到DSM的443端口,DSM都不用做任何改动,只不过这样在外部加一个VPS反代,访问性能上会有些损失,但这也是没有办法的事情了。 waylon 发表于 2018-3-19 12:54
无论是否使用443端口,DSM通过反向代理服务器自己解析二级域名的方法都是通用的,这种方法不用在域名注册 ...
只是这样就没有太大意义了。
而且收到VPS链接速度的限制。得不偿失啦
启用自定义域就可以呀 干嘛要用反向代理