Unraid基于Acme与NginxProxyManager申请免费证书且自动更新并配合内网穿透实现Https安全访问_engineerlzk的博客-程序员秘密

技术标签: UnRaid  内网穿透  SSL证书  https  自动更新  docker  

       标题虽然有点拗口,但确实是很多爱折腾的朋友需要实现的功能,通过我无数次的构思与实验,终于探索出了一条可行路径,当然,如果你本身已经拥备公网ip,则远远没有如此麻烦,可以看看网上的其它文章,但本文对你依然有帮助,只是不需要其中的一些步骤罢了。好了,言归正传,开启折腾实录之旅——大佬勿喷,我只是希望和我一样的小白能够搞清楚而已。

  • 我的配置和打算:

      最近中毒组了1台N1机箱的Nas小主机,华擎Z490m-itx/ac主板,qtb0-10900T处理器,16G+8G的DDR4内存条,硬盘若干,还购买了Unraid专业版正版授权,想着不折腾点实用功能都对不起这些高档(囧)的配件和软件。于是就想在该Unraid系统上安装自己的私有密码管理器(告别在线密码的隐私风险)、自己的图书管理系统、自己的邮件系统、自己的office系统……,而其中的密码管理系统等是需要https才能正常访问和部署的,于是就有了这篇折腾实录。

  • 需要安装的docker应用和插件:

  • Acme(用于申请ssl免费证书)
  • NginxProxyManager(反向代理)
  • Vaultwarden(密码管理系统)
  • User Scripts(添加用户自定义脚本,本文中用于自动申请、拷贝、安装、更新ssl证书)

  • Vaultwarden安装:

        其它很多地方都是关于bitwarden的教程,在unraid中只有vaultawarden,在应用市场中搜索Vaultwarden按模板填写参数安装即可,只需规划好webui的端口即可(在unraid的docker页面查看docker应用也是可以找到这个端口数字的

  • Acme应用安装

        以申请mydomain.cf及其所有子域名的ssl证书为例,且是以在godaddy中解析的域名为例的,如果你是在其它dns解析商,可参考说明文档将其中一些参数修改为你自己的):

  • 创建容器:

 docker run --rm -itd -v /mnt/user/appdata/ssl/mydomain-cf:/acme.sh \

-e GD_Key=***** \

-e GD_Secret=***** \

--net=host --entrypoint /bin/sh --name=acme.sh neilpang/acme.sh

注意:】其中Key和Secret需要你自己在godaddy解析的核实页面自行创建并第一时间记录,之后不再显示。

  • 申请证书:

        更改默认证书为letsencrypt,否则报错,需要邮箱注册(因为acme将默认证书设置成了ZeroSSL)

docker exec acme.sh --set-default-ca  --server  letsencrypt

         正式申请证书:(我的是由godaddy负责域名解析,其它的情参考acme的说明)

docker exec acme.sh --issue --dns dns_gd -d mydomain.cf -d *.mydomain.cf

        安装证书:(执行后将在创建容器那1步设置的路径中生成privkey.pem和fullchain.pem这两个证书文件)--这一步只需要更改-d后的域名,其它都不能动,否则会出错!(你可以先将这2个证书文件下载到本地备用——一会儿需要上传到NginxProxyManager中

docker exec acme.sh --install-cert -d mydomain.cf \

--key-file /acme.sh/privkey.pem \

--fullchain-file /acme.sh/fullchain.pem

        将证书拷贝到NginxProxyManager应用中(在NginxProxyManager应用安装后再进行,请参照NginxProxyManager应用安装步骤)

  • NginxProxyManager应用安装:

  • 安装:

        NginxProxyManager是一款专门提供反向代理的软件(应该还有其他功能,我还没有研究,爱折腾的朋友请自行摸索)。可在unraid的app商店中直接搜索NginxProxyManager进行安装,我是全部缺省确认安装的。它的安装界面大致如下:

        记住图中的3个端口:7818是程序的管理端口,NginxProxyManager的管理界面从这个端口进行访问;1880是程序的http端口,你反代到程序的http页面通过这个端口访问;18443是程序的https端口,你反代到程序的https页面通过这个端口访问。你可以把这3个端口改成你想要的或喜欢的数字,只要不和其他端口重合就行。

  • 登录:安装后我们就可以用unrai的ip:7818登录管理页面:

默认的登录账户和密码是:

Email address: [email protected]

Password: changeme

登录进去后,会弹出一个窗口,让你修改登录账户和密码(自己把它记录好,以后都要用这个账户和密码登录)。

  • 导入ssl证书:

        在NginxProxyManager中导入一次custom证书(否则在下一步拷贝证书文件时是找不到证书目录npm-*的——我导入后增加了一个子目录npm-1),其中key是私钥即privkey.pem,certificates是域名证书即fullchain.pem(这2个文件是Acme安装证书那一步生成并下载到本地的

  • 拷贝证书:

将证书文件拷贝到NginxProxyManager证书目录下(到底是npm-*可以在上一步导入证书后自行到custom_ssl目录下去查看)

cp /mnt/user/appdata/ssl/5inas-cf/*.pem /mnt/user/appdata/NginxProxyManager/custom_ssl/npm-1/

  • 重启NginxProxyManager:

在unraid网页管理docker页面重启或输入如下命令重启

docker exec NginxProxyManager reboot

  • 添加反向代理:

Dashboard】→【Add Proxy Host】按提示填写(一定要对照欲代理的应用的ip和端口对应——比如我的密码库域名是mima.mydomain.cf,docker地址是http://192.168.18.109:1080)→域名填写mima.mydomain.cf,Scheme就用缺省的http,Forward hostname/ip就填写192.168.18.109(我曾尝试填写127.0.0.1,因为我认为我的docker应用npm与vaultwardens是在同一个主机上,仅是端口不一样而已,结果不成功!),forwar port填写1080,一切ok!

 

如此设置后,我们把mima.mydomain.cf解析到https://192.168.18.109:18443,然后通过npm再反向代理到http://192.168.18.109:1080,以实现https加密访问(下面分公网和大内网分别进行说明——这部分只作简要说明,不懂的朋友自行爬网恶补这方面的知识)。

——对于公网,将域名解析到你的路由器公网ip(或者通过动态dns方式),在你的路由器上将18443端口映射到你的unraid主机ip192.168.18.109,这样通过mima.mydomain.cf:18443可以成功访问。

——对于大内网,可以通过frp等内网穿透方式将域名mima.mydomain.cf指向https://192.168.18.109:18443,这样看直接通过https://mima.mydomain.cf不带端口方式访问。

按理到这一步就已经大功告成了,但是由于Acme申请的免费ssl证书的有效期只有90天,所以我们必须在其失效之前再次申请并将其拷贝到docker应用npm中,于是请出下一步的User Scripts插件。

  • User Scripts安装和设置:

在应用市场中搜索User Scripts并安装即可,然后在插件中找到User Scripts插件,添加代码,并将其设定为用户自定义计划任务(custom),输入0 0 0 1 9/2(从9月开始每隔2个月的1日 执行一次,可以到【在线cron表达式生成器】按条件生成

代码如下:

docker run --rm -itd -v /mnt/user/appdata/ssl/mydomain-cf:/acme.sh -e GD_Key=***** -e GD_Secret=***** --net=host --entrypoint /bin/sh --name=acme.sh neilpang/acme.sh;

docker exec acme.sh --set-default-ca  --server  letsencrypt;

docker exec acme.sh --issue --dns dns_gd -d mydomain.cf -d *.mydomain.cf --force;

docker exec acme.sh --install-cert -d mydomain.cf --key-file /acme.sh/privkey.pem --fullchain-file /acme.sh/fullchain.pem;

cp -rf /mnt/user/appdata/ssl/mydomain-cf/*.pem /mnt/user/appdata/NginxProxyManager/custom_ssl/npm-1/;

docker exec NginxProxyManager reboot

  • 成功安全访问vaultwarden应用

.

 

  • 结语

最后再来捋一下实现的思路:

1.AcmeSSL申请免费SSL证书(并通过用户自定义脚本2月定时更新)

2.添加用户docker应用

3.npm调用免费SSL证书,并根据用户需求添加反向代理指向docker应用的ip和端口

4.开启折腾模式……

提醒:全部测试OK后记得开启npm和vaultwarden及你想运行的应用的自启动功能。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/engineerlzk/article/details/120248413

智能推荐

计算机是如何启动的?_chengsu9734的博客-程序员秘密

从打开电源到开始操作,计算机的启动是一个非常复杂的过程。 我一直搞不清楚,这个过程到底是怎么回事,只看见屏幕快速滚动各种提示...... 这几天,我查了一些资料,试图搞懂它。下面就是我整理的笔记。 零、boot的含义 先问一个问题,"启动"用英语怎么说? 回答是boot。可是,bo...

重新学C语言2_一只小菜gou的博客-程序员秘密

题目 1003: [编程入门]密码破译题目描述要将"China"译成密码,译码规律是:用原来字母后面的第4个字母代替原来的字母.例如,字母"A"后面第4个字母是"E".“E"代替"A”。因此,“China"应译为"Glmre”。请编一程序,用赋初值的方法使cl、c2、c3、c4、c5五个变量的值分别为,’C’、’h’、’i’、’n’、’a’,经过运算,使c1、c2、c3、c4、c5分别变为’G’、’l’、’m’、’r’、’e’,并输出。#include<stdio.h>#includ

[c++11]多线程编程(六)——条件变量(Condition Variable)_鱼裸忧伤的博客-程序员秘密

转自:https://www.jianshu.com/p/c1dfa1d40f53互斥锁std::mutex是一种最常见的线程间同步的手段,但是在有些情况下不太高效。假设想实现一个简单的消费者生产者模型,一个线程往队列中放入数据,一个线程往队列中取数据,取数据前需要判断一下队列中确实有数据,由于这个队列是线程间共享的,所以,需要使用互斥锁进行保护,一个线程在往队列添加数据的时候,另一个线程...

本地socket unix domain socket_brk1985的博客-程序员秘密

socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIXDomain Socket。虽然网络socket也可用于同一台主机的进程间通讯(通过loopback地址127.0.0.1),但是UNIX Domain Socket用于IPC更有效率:不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进...

[Python程序课程设计] 利用sqlalchemy封装mysql操作_cp0328的博客-程序员秘密

如图所示的要求。我选择的是第一个,正好练习练习sqlalchemy.在此之前,你需要自行安装sqlalchemy相关库。1.增创造一个Session实例,之后调用add(Emp实例)Session_class = sessionmaker(bind=engine)Session = Session_class()emp_obj = Emp(id=id, name=name, age=...

【算法】二分答案法--暴力搜索答案方法_immoshi的博客-程序员秘密

1,例子 浅谈二分答案2,解析 二分答案法、三分法3,

随便推点

TCP/UDP协议常用端口号服务_1521端口_MHSMIE的博客-程序员秘密

端口号的范围是从1~65535。其中1~1024是被RFC 3232规定好了的,被称作“众所周知的端口”(Well Known Ports);从1025~65535的端口被称为动态端口(Dynamic Ports),可用来建立与其它主机的会话,也可由用户自定义用途。一些常见的端口号及其用途如下: TCP 21端口:FTP 文件传输服务 TCP 23端口:TELNET 终端仿真服务

使用Java将字符串转码utf-8成8进制数字_chengtang2028的博客-程序员秘密

package demo0809.demo1;import java.io.UnsupportedEncodingException;import java.net.URLEncoder;public class Test333 { public static void main...

/etc/profile和~/.bash_profile的区别与联系_etc/.bash_profile_迷途大灰狼的博客-程序员秘密

/etc/profile为系统的每个用户设置环境信息和启动程序,当用户第一次登录时,该文件被执行,其配置对所有登录的用户都有效。当被修改时,必须重启才会生效。英文描述:”System wide environment and startup programs, for login setup.”/etc/environment系统的环境变量,/etc/profile是所有用户的环境变量...

ambari 编译_diannao720的博客-程序员秘密

1.phantomjs PHANTOMJS_CDNURL=http://cnpmjs.org/downloads mvn -B clean install package jdeb:jdeb -DskipTests -Dpython.ver="python >= 2.6" -Preplaceurl

Python 散点图线性拟合_50个数据可视化最有价值的图表(附完整Python代码,建议收藏)..._weixin_39627405的博客-程序员秘密

作者:lemonbit微信公众号:Python数据之道from Unsplash [email protected] Enerio翻译 |Lemon来源 | Machine Learning Plus本文总结了 Matplotlib 以及 Seaborn 用的最多的50个图形,掌握这些图形的绘制,对于数据分析的可视化有莫大的作用,强烈推荐大家阅读后续内容。如果觉得内容不错,欢迎分享到您的朋友圈。Tips...

推荐文章

热门文章

相关标签