如何在 Ubuntu 16.04 上用 Let's Encrypt 加密 GitLab

金钱(警告)

** 状态:** 被贬值

本文涵盖了使用 Let's Encrypt 手动配置 GitLab 的较旧方法。 从 GitLab 版本 10.5开始, Let's Encrypt 支持在 Gitlab 中可用。

我们的指南 如何在Ubuntu 16.04上安装和配置GitLab已更新,以包括GitLab中的相关配置设置。

介绍

GitLab,特別是GitLab CE(Community Edition),是一個開源應用程序,主要用於托管Git儲存庫,具有額外的開發相關功能,如問題追蹤。

默认情况下,GitLab 通过简单的,未加密的 HTTP 服务页面. 与处理敏感信息(如登录凭证)的任何 Web 应用一样,GitLab 应该配置为通过 TLS/SSL 服务页面来加密过境中的数据。

Let's Encrypt 项目可用于为任何网站或 Web 应用程序轻松获取可信的 SSL 证书. Let's Encrypt 提供由其证书授权机构签署的证书,这些证书是所有现代网页浏览器所信任的,如果您可以证明您拥有您正在申请证书的域名。

在本指南中,我们将展示如何配置在Ubuntu 16.04上安装的GitLab实例,以使用从Let's Encrypt获得的可信的SSL证书。

前提条件

要完成本指南,您需要在 Ubuntu 16.04 服务器上安装一个 GitLab 实例,我们将假定您已经遵循我们的 如何在 Ubuntu 16.04 上安装和配置 GitLab指南来设置此设置。

为了从 Let’s Encrypt 获取证书,您的服务器必须配置一个完全合格的域名(FQDN)。如果您还没有注册域名,您可以与许多域名注册商之一(例如 Namecheap、GoDaddy 等)进行注册。

如果您还没有,请确保创建一个 A 记录,将您的域名指向您的服务器的公共 IP 地址. 这是由于 Let's Encrypt 验证您拥有它正在发行证书的域名的方式所必需的。

安装Certbot,让我们加密客户端

在我们能够为我们的GitLab安装获得SSL证书之前,我们需要下载并安装Certbot,这是官方的Let's Encrypt客户端。

Certbot 开发人员维护自己的 Ubuntu 软件存储库,其中包含软件的最新版本,因为 Certbot 正在进行如此积极的开发,因此值得使用此存储库来安装比 Ubuntu 提供的更新的 Certbot。

首先,添加存储器:

1sudo add-apt-repository ppa:certbot/certbot

接下来,更新包列表以获取新库的包信息:

1sudo apt-get update

最后,用apt-get安装Certbot:

1sudo apt-get install certbot

现在,Certbot已安装,我们可以准备我们的服务器,以便它能够成功地响应Let's Encrypt在发行证书之前所需的域所有权验证测试。

准备好我们加密 Web 根域验证

为了从 Let’s Encrypt 证书授权机构获得 SSL 证书,我们必须证明我们拥有该证书将提供的域名,有多个方法证明域名所有权,每个方法都需要 root 或管理员访问服务器。

GitLab 包含一个内部管理的 Nginx Web 服务器,用于服务应用程序本身,这使得安装变得相当自在,但在尝试修改 Web 服务器时增加了额外的复杂性。

由于嵌入式 Nginx 目前正在被用来服务 GitLab 本身,最好的域验证方法是 Web 根方法. Certbot 将使用现有的 Web 服务器从端口 80 的服务器服务一个已知的文件,这向证书机构证明要求证书的人对 Web 服务器有行政控制,这有效地证明了对服务器和域的所有权。

要为 GitLab 设置 Web 根域验证,我们的第一步将是创建一个 dummy 文档根:

1sudo mkdir -p /var/www/letsencrypt

它不会被正常的 Nginx 操作使用,但会被 Certbot 用于域验证。

接下来,我们需要调整 GitLab 的 Nginx 配置以使用此目录。

1sudo nano /etc/gitlab/gitlab.rb

内部,我们需要添加一行,将一个自定义指令注入到GitLab的Nginx配置文件中。

点击下列行:

1[label /etc/gitlab/gitlab.rb]
2. . .
3nginx['custom_gitlab_server_config'] = "location ^~ /.well-known { root /var/www/letsencrypt; }"
4. . .

Let’s Encrypt Web 根验证方法将文件放置在文件根中的已知目录中,以便证书机构能够验证它。

完成后,保存并关闭文件。

接下来,通过重新配置应用程序,将更改应用于 GitLab 的 Nginx 配置:

1sudo gitlab-ctl reconfigure

服务器现在应该设置以成功验证您的域名。

通过 Certbot 申请证书

现在GitLab的Nginx实例已经配置了所需的位置块,我们可以使用Certbot来验证我们的域名并请求证书。

因为我们只需要一个证书,而不希望自动重新配置网页服务器,我们会使用certonly子命令。我们会指定三个选项。我们需要选择网页根身份验证器(--webroot),通过文档根(--webroot-path=/var/www/letsencrypt),并使用-d命令传输我们的域名:

1sudo certbot certonly --webroot --webroot-path=/var/www/letsencrypt -d your_domain

您将被要求提供电子邮件地址. 包含有效的电子邮件地址很重要,因为这是唯一可靠地接收有关证书到期和其他重要信息的电子邮件的方式。

一旦您完成,Let's Encrypt 应该为您发放域的证书,如果它能够正确验证所有权,您应该看到类似于此的输出:

 1[secondary_label Output]
 2IMPORTANT NOTES:
 3 - Congratulations! Your certificate and chain have been saved at
 4   /etc/letsencrypt/live/gitlab.example.com/fullchain.pem. Your cert
 5   will expire on 2017-07-26. To obtain a new or tweaked version of
 6   this certificate in the future, simply run certbot again. To
 7   non-interactively renew *all* of your certificates, run "certbot
 8   renew"
 9 - If you lose your account credentials, you can recover through
10   e-mails sent to [email protected].
11 - Your account credentials have been saved in your Certbot
12   configuration directory at /etc/letsencrypt. You should make a
13   secure backup of this folder now. This configuration directory will
14   also contain certificates and private keys obtained by Certbot so
15   making regular backups of this folder is ideal.
16 - If you like Certbot, please consider supporting our work by:
17
18   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
19   Donating to EFF:                    https://eff.org/donate-le

您可以通过查看sudo特权的/etc/letsencrypt/live/your_domain目录来找到创建的所有证书和密钥:

1sudo ls /etc/letsencrypt/live/your_domain
1[secondary_label Output]
2cert.pem chain.pem fullchain.pem privkey.pem

对于我们的配置,我们只需要知道到fullchain.pemprivkey.pem文件的完整路径。

配置 GitLab 以使用 Let's Encrypt 证书

现在我们已经从 Let’s Encrypt 获得了可信证书,我们可以将 GitLab 配置为所有流量使用 TLS/SSL。

编辑 GitLab 配置

重新打开 GitLab 配置文件:

1sudo nano /etc/gitlab/gitlab.rb

在顶部,更改external_url。目前,它可能指向http://your_domain.我们只需要更改httphttps:

1[label /etc/gitlab/gitlab.rb]
2. . .
3external_url 'https://your_domain'
4. . .

接下来,滚回 GitLab Nginx 部分. 删除评论并修改或简单地添加下列行。

重定向线告诉 Nginx 自动重定向 HTTP 端口 80 到 HTTPS 端口 443 的请求。 ssl_certificate 线应该指向 fullchain.pem 文件的完整路径,而 ssl_certificate_key 线应该指向privkey.pem 文件的完整路径:

1[label /etc/gitlab/gitlab.rb]
2. . .
3nginx['redirect_http_to_https'] = true
4. . .
5nginx['ssl_certificate'] = "/etc/letsencrypt/live/your_domain/fullchain.pem"
6nginx['ssl_certificate_key'] = "/etc/letsencrypt/live/your_domain/privkey.pem"
7. . .

保存并关闭文件,当你完成。

通过防火墙允许 HTTPS 流量

接下来,在重新加载 GitLab 的 Nginx 配置之前,请确保通过服务器的防火墙允许 HTTPS 流量。

1sudo ufw allow https
1[secondary_label Output]
2Rule added
3Rule added (v6)

检查 443 端口是否打开,键入:

1sudo ufw status
 1[secondary_label Output]
 2Status: active
 3
 4To Action From
 5--                         ------      ----
 6OpenSSH ALLOW Anywhere                  
 780 ALLOW Anywhere                  
 8443 ALLOW Anywhere
 9OpenSSH (v6)               ALLOW Anywhere (v6)             
1080 (v6)                    ALLOW Anywhere (v6)             
11443 (v6)                   ALLOW Anywhere (v6)

正如你所看到的,端口443已被曝光。

重新配置 GitLab 以启用 SSL

现在,重新配置 GitLab 来实现您的更改:

1sudo gitlab-ctl reconfigure

您的 GitLab 实例现在应该通过使用您受信任的 Let's Encrypt 证书通过 HTTPS 访问。您可以通过访问您的 GitLab 服务器的域名来测试此功能。

1http://your_domain

您的浏览器应该自动重定向您使用HTTPS,您应该看到某些迹象表明该网站在地址栏中是安全的:

GitLab SSL verification

您的 GitLab 安装现在通过 TLS/SSL 证书得到保护。

验证 Certbot 自动更新

Let's Encrypt 的证书仅有效 90 天,这是为了鼓励用户自动化其证书更新过程,我们安装的certbot包为我们负责,每天通过 systemd 计时器运行certbot renew 两次,在非 systemd 发行版中,此功能由放置在 `/etc/cron.d 中的脚本提供。

要测试更新过程,您可以使用certbot进行干跑:

1sudo certbot renew --dry-run

如果你看不到任何错误,你都已经设置了。当需要时,Certbot会更新你的证书并重新加载 Nginx 来接收更改。如果自动更新过程有时失败,Let’s Encrypt 会向你指定的电子邮件发送消息,提醒你你的证书即将到期。

结论

你的GitLab实例现在应该通过一个安全的TLS/SSL证书来保护,这是所有现代浏览器都信任的。虽然配置嵌入式Nginx实例比设置单独的Nginx网络服务器更为复杂,因为GitLab暴露了在配置文件中定制位置块的功能,所以很容易工作。

现在你的 GitLab 实例是安全的,可以安全地使用它来管理项目,主机代码存储库,并配置连续集成。

Published At
Categories with 技术
comments powered by Disqus