我们不能失去信仰

我们在这个世界上不停地奔跑...

0%

群晖GitLab创建https访问

为什么要使用HTTPS

举一个例子,以前自己搭建的http网站,总是遇到js无法正确执行,并且页面里夹杂了本来没有的广告。问题出现在了运营商线路上,比如说我手机网络是移动的,然后用微信访问http绑定页面,偶尔就会出现移动查流量等等的广告。这是因为信息在传递的时候,走运营商网络,因为我的信息是http传递,没有加密,所以运营商在里面嵌入了广告修改后,再把信息传递给我的终端。

并且http本来就是不安全的,平时在家访问下http没什么事情,但是有时候还是需要在外面访问的,信息安全就得不到保证。

群晖GitLab HTTPS 设置

这里,演示一下群晖 GitLab 如何设置 HTTPS,其他服务也同理可以参考。

前言: 我有公网IP,并且路由器可以做端口转发。

先说下最终实现的功能:

1. 外网可以直接通过https访问,不需要加端口号
 2. 通过二级子域名进行访问,端口可以复用
 3. GitLab 里面clone显示的是我在外网使用的域名

具体实现

关于公网IP及路由转发不在阐述。

关于群晖安装GitLab不在阐述。

设置Docker

GitLab 安装完成后,可以打开Docker,然后在容器里面选择synology_gitlab 进行编辑,在环境变量一栏加入如下参数:

1
2
GITLAB_HTTPS    true
SSL_SELF_SIGNED true

Jietu20200412-152450

然后找到里面的 GITLAB_PORT 一项,这一项如果你要设置 HTTPS ,请把端口设置成443, 否则你点击 clone 的时候,主域名后面还是会跟着你物理机实际访问的端口,比如我的物理机实际访问端口是 20000,他就会跟一个 xxxx.com:20000。

打开file station, 准备上传https证书文件,我的证书是在阿里云上面申请的免费个人版。如果你的域名是阿里云的,就可以直接申请免费的个人版,就不需要自己生成。自己生成的证书chrome浏览器会提示是不信任的证书的。

阿里云地址

先说阿里云上面的操作:申请方式自己搜一下教程,申请完毕后,下载 Nginx 版本的文件,然后改名gitlab.crt、 gitlab.key,然后打开群晖的 File Station 在docker/gitlab/gitlab/ 这个目录下创建一个文件夹,名字叫 certs,把证书文件上传到这个文件夹里。阿里云没有提供 GitLab 官方文档里说的 dhparam.pem 文件,这个需要我们自己生成一下, 打开电脑自带终端,如果已经安装了 openssl ,则可以直接执行生成,否则请先安装 openssl 。

1
openssl dhparam -out dhparam.pem 2048

执行上面的命令就可以在你执行的这个目录下面生成一个 dhparam.pem 文件,然后把这个文件也放到刚才的 certs 目录下。至此,Docker 方面已经设置完毕。

现在如果我们直接运行Gitlab,可以在通过

协议(http或者https)://nas服务器ip:端口号 进行访问到 GitLab,如果访问不到,可以查看下Docker的日志,是否有错误,看下是否nginx没有跑起来,也可以登入Docker控制台,通过 nginx -t 检查 nginx 配置文件是否正确。

现在已经设置了 Docker 走https, 所以不要用 Chrome 浏览器进行访问,它默认会拦截的,因为证书的域名和你在浏览器输入的不一致,可以用 safari 浏览器访问,然后信任一下就可以了。

至此,如果我们现在直接把端口代理出去的话,也是可以的,直接路由器 443 端口对应群晖里的GitLab刚才设置的https 端口就可以。但是这样的话是有一个问题的,就是端口无法复用,比如说我的gitlab 域名 https://gitlab.xxx.com 像直接访问gitlab, 另一个服务 https://myhome.xxx.com 想访问路由器的控制界面,就无法实现,所以我们接下来通过反向代理工具,让它通过不同的二级域名来进行不同的端口转发。

设置群晖反向代理

接下来我们利用群晖自带的反向代理工具来把我们gitlab的20000 端口代理到一个包含有二级域名的域名上面,这样就可以不加端口进行访问。

首先,打开控制面板—>应用程序门户—>反向代理服务器, 点击新增:

Jietu20200412-155705

描述随便取个名字,协议选择 https, 主机名填写你的域名,比如我的 gitlab.xxxx.com

端口填写443, 然后目的地: 协议选择https,主机名就是localhost, 端口填写Gitlab内网https访问的端口。

确定就可以了。

然后,我们需要先把证书文件也放到群晖里面一份。

打开控制面板—-> 安全性 —> 证书 , 点击新增Jietu20200412-154857

下一步:

Jietu20200412-154939

随便写个描述名字,选择导入证书,然后下一步

Jietu20200412-155033

然后把私钥以.key结尾的文件,及证书以.pem结尾的文件放到里面,中间证书可以不填,然后确定就好了。

然后界面会出现你刚刚添加过的证书,点一下上方第二栏的配置选项,给不同的服务配置不同的证书,找到你刚才在应用程序门户里面加的gitlab服务,应该就是你刚才填写的来源里面的主机名,然后证书选择你刚添加的证书确定。

操作完成后,开启 GitLab 服务。

最后一步,设置我们的路由器,DDNS服务假设你已经弄好了,比如 gitlab.xxxx.com 直接就可以解析到我们的公网ip, 然后在路由器面设置端口转发,如果运营商没封你的443端口, 设置转发 443 端口到 群晖主机的443端口

Jietu20200412-160406

然后,就可以拿域名进行https访问了。

如果想保留http,只需要在 Docker 里面加入http端口映射,然后反向代理那边加入同样的域名设置,端口80协议设置成http, 路由器开发80端口转发到nas服务器80端口就可以了。 用户通过http访问,会自动重定向到 https 。

QAQ

  1. 通过https加域名显示什么都没有

    首先确保 ddns 是否正常运作,确保有公网ip,ddns的前提是要有公网ip

    确保 GitLab 运行正常,在内网是可以访问到的

    1. 通过https加域名显示证书不受信任

    点开证书看看是不是你刚才添加的那个证书,如果不是的,就说明在安全性那里你没有给GitLab 服务更改默认的证书, 所有服务的默认证书都是 群晖自带的证书。

    1. 证书没问题,但是访问到的页面确实群晖的错误页面

    出现这样的情况主要是因为你的 Docker GitLab 服务没有跑起来,或者说你的反向代理那里设置出错了,端口需要对应。

上面简略说明了一下,我的具体配置参数

硬件: 蜗牛星际主机8G内存

黑群晖 + 软路由 Lede + 光猫桥接

软路由 Lede 拨号有公网IP, 软路由配置 DDNS 服务解析域名

gitlab.xxxx.com

myhome.xxxx.com

软路由端口映射 443 到 nas 443

软路由端口映射 80 到 nas 80

群晖证书设置: 阿里云申请个人免费版证书,这种证书不同通配符证书,所以一个证书只能对应一个子域名,比如我申请一个 gitlab.xxxx.com 的证书,那么这个就只能是 gitlab.xxxx.com 这个域名,myhome.xxxx.com就不行,需要在申请一个 myhome.xxxx.com 就可以了,一共好像可以申请20个。

先在应用门户中添加反向代理信息,才可以在证书里面进行 配置选项,选择服务对应的证书。

Docker GitLab ,端口方面 ssh端口自己设置,我这里只展示 http 及https 端口:

本地端口 20002 对应容器端口 443

本地端口 20000 对应容器端口 80

之所以不仅设置了https也设置了http是因为用户使用http地址可以直接跳转到https的地址,而不是直接显示404 not found。

Jietu20200412-163456

Docker 设置

Jietu20200412-163557

反向代理设置

Jietu20200412-163658

证书设置

Jietu20200412-160406

上面路由端口映射设置

Jietu20200412-163834

ddns 设置