介绍
GitLab,特别是GitLab CE(社区版),是一个开源应用程序,主要用于托管Git存储库,以及与开发相关的其他功能,如问题跟踪。 GitLab项目使得它相对简单,在您自己的硬件上设置一个GitLab实例,具有简单的安装机制。
默认情况下,GitLab为普通的,未加密的HTTP提供页面。 像处理敏感信息(如登录凭据)的任何Web应用程序一样,GitLab应配置为通过TLS / SSL提供页面来加密传输中的数据。 这对于GitLab非常重要,因为您的项目的代码库可能会被某人截获您的登录凭据而改变。
Let's Encrypt项目可用于轻松获取任何网站或Web应用程序的受信任的SSL证书。 Let's Encrypt提供由其所有现代网络浏览器信任的证书颁发机构签发的证书,如果您可以证明您拥有您请求证书的域名。
在本指南中,我们将演示如何配置安装在Ubuntu 16.04上的GitLab实例,以使用从Let's Encrypt获得的受信任的SSL证书。 这将保护与用户的所有传出通信,并确保密码,代码和任何其他通信被保护不被外界读取或篡改。
先决条件
要完成本指南,您需要在Ubuntu 16.04服务器上安装一个GitLab实例。 我们假设你已经按照我们如何安装和Ubuntu上配置GitLab 16.04指南得到这个成立。
为了从Let's Encrypt获取证书,您的服务器必须配置完全限定域名(FQDN)。 如果您还没有注册域名,您可以向其中一个域名注册商(例如Namecheap,GoDaddy等)注册一个域名。
如果你还没有准备好,一定要创建一条A记录指向你自己的域名服务器的公网IP地址。 这是必需的,因为Let's Encrypt验证您拥有它为其颁发证书的域。 例如,如果你想获得一个证书gitlab.example.com
,该域必须解析到服务器的验证过程工作。 您需要一个包含指向您的服务器的有效DNS记录的真实域才能成功完成本指南。
安装让我们加密客户端
在我们为GitLab安装获取SSL证书之前,我们需要下载并安装Let's Encrypt客户端。
虽然咱们加密更名他们客户certbot
,包括在Ubuntu 16.04版本库被简单地称为客户端letsencrypt
。 这个版本将完全适合我们的目的。 更新服务器的本地apt
包索引,然后键入以下命令安装客户端:
sudo apt-get update
sudo apt-get install letsencrypt
现在,安装了Let's Encrypt客户端,我们可以准备我们的服务器,以便它可以成功地响应在发出证书之前让我们加密需要的域所有权验证测试。
准备让我们加密Web根域验证
为了从Let's Encrypt证书颁发机构接收SSL证书,我们必须证明我们拥有该证书将提供的域。 有多种方法可以证明域所有权,每种方法都需要root或管理员访问服务器。
GitLab包含一个内部管理的Nginx Web服务器,用于为应用程序本身提供服务。 这使得安装相当自包含,但它在尝试修改Web服务器本身时会增加额外的复杂性。
由于嵌入式Nginx当前被用于提供GitLab本身,最好的域验证方法是web根方法。 Let's Encrypt客户端将使用现有的Web服务器从端口80上的服务器提供一个已知文件。这向证书颁发机构证明,请求证书的人对Web服务器具有管理控制权,这有效地证明了服务器的所有权,域。
要为GitLab设置Web根域验证,我们的第一步是创建一个虚拟文档根:
sudo mkdir -p /var/www/letsencrypt
这将被正常的Nginx操作所使用,但将由Let's Encrypt客户端用于域验证。
接下来,我们需要调整GitLab的Nginx配置以使用此目录。 通过键入以下内容打开主GitLab配置文件:
sudo nano /etc/gitlab/gitlab.rb
在内部,我们需要添加一行,将一个自定义指令注入GitLab的Nginx配置文件。 这也可能是最好的向下滚动到该文件的GitLab Nginx的部分,但该行可以放在任何地方。
粘贴到以下行:
. . .
nginx['custom_gitlab_server_config'] = "location ^~ /.well-known { root /var/www/letsencrypt; }"
. . .
该让我们加密Web根目录的验证方法则以中的文件.well-known
目录中的文档根目录,这样的证书颁发机构可以验证它。 这行告诉Nginx的,以服务为请求/.well-known
从我们创建了一个刚才Web根目录。
完成后,保存并关闭文件。
接下来,通过重新配置应用程序将更改应用于GitLab的Nginx配置:
sudo gitlab-ctl reconfigure
服务器现在应设置为成功验证您的域。
使用Let's Encrypt请求证书
现在GitLab的Nginx实例配置了必要的位置块,我们可以使用Let's Encrypt客户端来验证我们的域名并请求一个证书。 因为我们只想要一个证书,不希望自动重新配置Web服务器,我们将使用certonly
子命令。
在Ubuntu 16.04存储库中包含的Let's Encrypt版本中,我们需要通过三个选项。 我们需要选择Web根认证( -a webroot
),通过在文档根( -w /var/www/letsencrypt
),并使用-d
命令来传递我们的域名:
sudo letsencrypt certonly -a webroot -w /var/www/letsencrypt -d your_domain
您将被要求提供一个电子邮件地址。 重要的是要包含有效的电子邮件地址,因为这是唯一可靠地接收有关证书过期和其他重要信息的电子邮件的方法:
接下来,您必须接受Let's Encrypt服务条款:
完成后,如果能够正确验证所有权,Let's Encrypt应向您颁发域的证书。 您应该看到类似于下面的输出:
OutputIMPORTANT NOTES:
- If you lose your account credentials, you can recover through
e-mails sent to account@example.com.
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/gitlab.example.com/fullchain.pem. Your cert
will expire on 2016-11-28. To obtain a new version of the
certificate in the future, simply run Let's Encrypt again.
- Your account credentials have been saved in your Let's Encrypt
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Let's
Encrypt so making regular backups of this folder is ideal.
- If you like Let's Encrypt, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
你可以找到所有通过查看创建的证书和密钥/etc/letsencrypt/live/ your_domain
与目录sudo
权限:
sudo ls /etc/letsencrypt/live/your_domain
Outputcert.pem chain.pem fullchain.pem privkey.pem
对于我们的配置,我们只需要知道完整路径fullchain.pem
和privkey.pem
文件。
配置GitLab以使用让我们加密证书
现在,我们已从Let's Encrypt获取可信证书,我们可以将GitLab配置为对其所有流量使用TLS / SSL。
编辑GitLab配置
首先再次打开GitLab配置文件:
sudo nano /etc/gitlab/gitlab.rb
在顶部,改变external_url
。 目前,它很可能指向http:// your_domain
。 我们只需要改变http
到https
:
. . .
external_url 'https://your_domain'
. . .
接下来,回到向下滚动到GitLab Nginx的部分。 取消注释和修改或简单添加以下行。
重定向行告诉nginx自动重定向到HTTP端口80发到HTTPS端口443请求ssl_certificate
线应指向的完整路径fullchain.pem
文件,而ssl_certificate_key
线应指向的完整路径privkey.pem
的文件:
. . .
nginx['redirect_http_to_https'] = true
. . .
nginx['ssl_certificate'] = "/etc/letsencrypt/live/your_domain/fullchain.pem"
nginx['ssl_certificate_key'] = "/etc/letsencrypt/live/your_domain/privkey.pem"
. . .
保存并在完成后关闭文件。
允许通过防火墙的HTTPS流量
接下来,在重新加载GitLab的Nginx配置之前,请确保允许HTTPS流量通过服务器的防火墙。 您可以打开端口443为此目的通过键入:
sudo ufw allow https
OutputRule added
Rule added (v6)
键入以下命令检查端口443是否打开:
sudo ufw status
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80 ALLOW Anywhere
443 ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
80 (v6) ALLOW Anywhere (v6)
443 (v6) ALLOW Anywhere (v6)
可以看到,端口443现在暴露。
重新配置GitLab以启用SSL
现在,重新配置GitLab以实现您的更改:
sudo gitlab-ctl reconfigure
您的GitLab实例现在应该可以通过HTTPS使用您的信任的Let's Encrypt证书访问。 您可以通过访问您的GitLab服务器的域名进行测试。 由于我们将HTTP重定向到HTTPS,这应该工作,没有明确指定协议:
http://your_domain
您的浏览器应该会自动将您重定向到使用HTTPS。 您应该会在地址栏中看到一些指示,表明网站已安全:
您的GitLab安装现在受到TLS / SSL证书的保护。
设置让我们加密证书自动续订
让我们加密TLS / SSL证书有效期为90天。 为了避免证书过期造成的中断,最好自动化证书续订。
该让我们的加密客户端包括renew
子命令会自动尝试更新是在到期日的30天内,任何证书。 此机制使用成功用于获取证书的最近的设置。
该renew
命令会自动跳过不属于其到期窗口内的任何证书,因此它是安全的相对频繁运行此命令。
打开root用户的crontab
通过键入:
sudo crontab -e
可能会要求您选择要使用的编辑器。 选择您喜欢的编辑器继续。
之后,您将会进入与现有的文本文件crontab
,这可能只是目前的意见。
在底部,添加以下行:
. . .
0 */12 * * * /usr/bin/letsencrypt renew >> /var/log/le-renew.log
5 */12 * * * /usr/bin/gitlab-ctl restart nginx
这将安排Let's Encrypt客户端每12小时检查一次,如果它的任何证书是在30天内到期。 如果是,它将尝试证书续订。 结果将在被记录到文件中/var/log/le-renew.log
两种方式。
我们等待五分钟,给予足够的时间来更新证书。 然后,我们称之为gitlab-ctl
,以重新启动Nginx的过程命令。
保存并在完成后关闭编辑器。
您的证书现在应设置为自动续订。 如果存在阻止证书更新的问题,Let's Encrypt会向您首次请求证书时提供的地址发送自己的有关证书过期的电子邮件警告。
结论
您的GitLab实例现在应该受到所有现代浏览器信任的安全TLS / SSL证书的保护。 虽然配置嵌入式Nginx实例比设置独立的Nginx Web服务器有点复杂,因为GitLab公开了在其配置文件中定制位置块的功能,它很容易解决。
现在你的GitLab实例是安全的,它可以安全地用于管理项目,主机代码存储库,并配置持续集成。