如何使用 gitlab 加密?

Posted

技术标签:

【中文标题】如何使用 gitlab 加密?【英文标题】:How do I use let’s encrypt with gitlab? 【发布时间】:2016-03-15 08:08:43 【问题描述】:

当我偶然发现let's encrypt 时,我开始研究 ssl 证书,我想将它与 gitlab 一起使用,但是它运行在树莓派 2 上并且现在运行得非常完美(所以我不想要搞砸了),我会去安装一个让我们正确加密ssl证书吗? PS:我的安装是综合的

【问题讨论】:

这里有一篇不错的文章供任何想要使用 GitLab 的免费托管服务进行设置的人使用:about.gitlab.com/2016/04/11/… 您也可以在这里查看分步说明:mkkhedawat.com/Enabling-HTTPS-for-Gitlab-pages-using-Certbot 【参考方案1】:

目前我能找到的最佳解决方案在this blog post 中进行了描述。我不会全部背诵,但重点是:

使用 webroot 验证器进行 Let's Encrypt 创建文件夹 /var/www/letsencrypt 并将此目录用作 webroot-path 进行 Let's Encrypt

更改/etc/gitlab/gitlab.rb 中的以下配置值,然后运行gitlab-ctl reconfigure

nginx['redirect_http_to_https'] = true
nginx['ssl_certificate']= "/etc/letsencrypt/live/gitlab.yourdomain.com/fullchain.pem"
nginx['ssl_certificate_key'] = "/etc/letsencrypt/live/gitlab.yourdomain.com/privkey.pem"
nginx['custom_gitlab_server_config']="location ^~ /.well-known \n alias /var/www/letsencrypt/.well-known;\n\n"

如果您使用的是 Omnibus 包附带的 Mattermost,那么您可以在 /etc/gitlab/gitlab.rb 中额外设置这些选项:

mattermost_nginx['redirect_http_to_https'] = true
mattermost_nginx['ssl_certificate']= "/etc/letsencrypt/live/gitlab.yourdomain.com/fullchain.pem"
mattermost_nginx['ssl_certificate_key'] = "/etc/letsencrypt/live/gitlab.yourdomain.com/privkey.pem"
mattermost_nginx['custom_gitlab_mattermost_server_config']="location ^~ /.well-known \n alias /var/www/letsencrypt/.well-known;\n\n"

在请求您的第一个证书后,记得将 external_url 更改为 https://... 并再次运行 gitlab-ctl reconfigure

这种方法非常优雅,因为它只是通过自定义 Nginx 配置将 Let's Encrypt 身份验证器使用的目录/var/www/letsencrypt/.well-known 挂载到 Gitlab web-root 中,并且在 Gitlab 运行时始终可以进行身份​​验证。这意味着您可以自动更新 Let's Encrypt 证书。

【讨论】:

@MikeH-R 好问题 - 我想说gitlab-ctl reconfigure 不是必需的,因为配置本身不会改变,但要让 nginx(可能还有其他组件)获取新证书gitlab-ctl restart 应该完成。可能gitlab-ctl restart nginx 就足够了。 @waspinator 也是一个好主意,虽然我认为不让 Let's Encrypt 身份验证器直接写入 GitLab 目录而是它自己的目录更优雅。 您可以类似地使用 nginx['custom_gitlab_mattermost_server_config'] 将letsencrypt添加到综合最重要的安装中 @rkallensee 和@waspinator,你的mattermost 配置中有错字,正确的变量名是mattermost_nginx['custom_gitlab_mattermost_server_config'] @JakobLenfers 谢谢,我改了答案!【参考方案2】:

根据您的基础架构设置(Raspi、大型云服务器或介于两者之间),有 2 种方法:

    如果您有一个外部可访问的服务器(意味着您的 Gitlab 主机可以从 Let´s Encrypt 服务器调用,这是 Let´s Encrypt 验证您“拥有”的自动机制所必需的" 像 gitlab.yoursite.com 这样的特定域以及相应的 DNS 解析服务器/主机)唯一需要(从 Gitlab 版本 10.7 开始)是添加一个 shttp/etc/gitlab/gitlab.rb 中的 Gitlab URL 配置中(正如 marcolz 已经提到的):

    external_url 'https://gitlab.yoursite.com'

来自https://docs.gitlab.com/omnibus/settings/ssl.html#let-39-s-encrypt-integration中的文档:

Omnibus-gitlab 可以自动从 让我们为您加密。

    如果您的 Gitlab 主机Let´s Encrypt 服务器无法从外部访问,则整个过程会更加困难!然后,您将离开让 Gitlab Omnibus 为您完成繁重工作的自动方式。 您现在肯定需要自己获取 Let´s Encrypt 证书! 有一些方法可以获取 Let´s Encrypt 证书,而无需外部可访问的服务器。

    我选择并建议使用替代的 Let´s Encrypt 客户端 dehydrated 和 dns-lexicon 以完全自动化获取证书的过程以及 Let´s Encrypt dns-challenge,它在 2016 年的某个地方推出。这是唯一的方法,您 不需要外部可访问的服务器 - 但您再次需要“拥有”某个域,例如 gitlab.yoursite.com AND 您需要对托管您的域的 DNS 提供商进行 API 访问(这里是 list of supported DNS providers in that case)。

    由于整个过程相当复杂,我创建了一个完全可理解的 Ansible 剧本prepare-gitlab.yml,其中使用 Omnibus 安装 Gitlab 的每一步都为您处理(完整的 GitHub 源代码可在此处获得:https://github.com/jonashackt/gitlab-ci-stack)。

    如果您只想创建 Let´s Encrypt 证书,请查看 obtain-letsencrypt-certs-dehydrated-lexicon.yml - 即使您不想使用 Ansible,您也可以在控制台上手动重现每个步骤或使用其他自动化工具像 Chef 或 Saltstack(尽管我个人不能推荐)。另一种方法是查看词典专家的这篇很棒的博文:https://blog.thesparktree.com/generating-intranet-and-private-network-ssl,从我基本上开发剧本的那些描述的步骤开始。

    无论您选择哪种方式,都不要忘记复制手动(或自动)从

    获取的 Let´s Encrypt 证书

    /srv/dehydrated/certs/ gitlab_domain /fullchain.pem

    /etc/gitlab/ssl/ gitlab_domain .crt

    /srv/dehydrated/certs/ gitlab_domain /privkey.pem

    /etc/gitlab/ssl/ gitlab_domain .key

    Gitlab 会自动为您从那里提取它们,正如 the way to manually configure HTTPS 中的文档所述

【讨论】:

【参考方案3】:

我不知道 Raspberry Pi 上的安装是否有所不同。 Let's Encrypt 安装过程有一些我不知道的魔法。

准备 Gitlab

键入grep 'external_url' /etc/gitlab/gitlab.rb 以检查网站名称。以 https://gitlab.example.com:50000

为例

如果您的外部 URL 不以 https 开头,请将其更改为以 https 开头

粗体部分将是您的<your domain name>

生成证书

按照此链接上的 Let's Encrypt 安装说明进行操作:https://letsencrypt.org/howitworks/

我不会复制说明,因为它们可能会发生变化(因为该程序目前处于公开测试阶段)。您必须运行什么取决于您是否还有在 Apache 上运行的网站,您希望为其生成 Let's Encrypt 证书。

生成 Let's Encrypt 证书后,它们位于 /etc/letsencrypt/live/<your domain name>/

复制证书

Gitlab 需要两个文件位于 /etc/gitlab/ssl/

有些事情我不确定,您可能需要使用此位置的答案转换 .pem 证书:Convert .pem to .crt and .key

将证书从/etc/letsencrypt/live/<your domain name>/cert.pem复制到/etc/gitlab/ssl/<your domain name>.crt

将私钥从/etc/letsencrypt/live/<your domain name>/privkey.pem复制到/etc/gitlab/ssl/<your domain name>.key

重新配置

运行gitlab-ctl reconfigure

【讨论】:

一件事,然后我就可以标记你的答案和“答案”,gitlab webroot在哪里? 我无法识别 webroot。在我的情况下,我一直在使用 Apache 来生成我的证书,并且我相信在这种情况下应该使用 --standalone (根据 letsencrypt.org/howitworks ),如果一个人不使用 Apache。不过可能需要暂时关闭 gitlab,我不确定。 @Hay 或 chabad360 :您是否设法集成了生成的 ssl 证书?证书是 pem 格式,但 nginx 需要 *.cert 格式。你是怎么处理的? 我开始怀疑我的回答了。也许***.com/questions/13732826/convert-pem-to-crt-and-key 是必要的一步。老实说,我的回答对我有用,但在特殊情况下,我的文件内容可能会被完全忽略(但它们需要存在于文件系统中)。【参考方案4】:

您需要在/etc/gitlab/ssl 中手动安装生成的证书,并将/etc/gitlab/gitlab.rb 中的外部url 设置为https,如下所述:https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/doc/settings/nginx.md

【讨论】:

【参考方案5】:

如果它对其他人有帮助,我写下了我在这里使用的过程:http://kelan.io/2016/using-lets-encrypt-to-add-ssl-to-gitlab/

我之前已经设置了 GitLab(通过从源代码安装),只是尝试使用 Let's Encrypt 添加 SSL。

重点是:

使用standalone模式letsencrypt 制作一份gitlab-shell可读的证书副本

【讨论】:

【参考方案6】:

您需要在 /etc/gitlab/ssl 中手动安装生成的证书,并在 /etc/gitlab/gitlab.rb 中将外部 url 设置为 https,如下所述:https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/doc/settings/nginx.md

我更喜欢使用符号链接,因此您不需要复制证书。 enter link description here

【讨论】:

【参考方案7】:

如果您的 Gitlab 实例无法通过 Internet 访问,则您不能使用 Gitlab 的内置 LetsEncrypt 机制,因为它在您的 Gitlab 的 URL 上使用 HTTP 质询/响应。您可以使用 DNS 质询/响应,而无需将 Gitlab 暴露在互联网上,并且可以完全自动化它。

这个答案是假设Gitlab Omnibus install。

如果您不想或不能使用 HTTP 质询/响应方法,而您想使用 DNS 方法,那么您必须在 Gitlab 之外进行。一种方法是使用 acme.sh 而不是 Gitlab 提供的内置 LetsEncrypt 支持。

您需要具有受支持 API 的 DNS 提供商。如果您的 DNS 没有 API,那么您可以使用 DNS Alias 和另一个具有受支持 API 的 DNS。我使用了LuaDNS,这样的轻度使用是免费的。

不重写documentation,它是这样的:

做任何您需要做的事情,在您选择的 API DNS 上注册并启用其 API。在 LuaDNS 上,必须明确启用 API,并且您必须在 API 工作之前验证您的电子邮件地址。记下 API 令牌。

在您的 API DNS 上创建一个子域,例如 acme.example.com。注意它的名称服务器。

在您的 example.com DNS 上创建 NS 记录,以便 acme.example.com 指向这些名称服务器中的每一个,如下所示(注意尾随点):

acme.example.com NS ns1.myapidns.com.

在您的example.com DNS 上设置一个 CNAME 以指向您的 API DNS,如下所示(注意尾随点):

_acme-challenge.gitlab.example.com CNAME _acme-challenge.acme.example.com.

配置 Gitlab 使用 SSL:添加到 /etc/gitlab/gitlab.rb:

external_url "https://gitlab.example.com"
letsencrypt['enable'] = false
registry_external_url 'https://gitlab.example.com.:5050'

(如果不想开启Gitlab Container Registry,第三行可以省略)

安装先决条件(如果尚未安装)

# apt install cron sudo

acme 进程创建一个非特权用户帐户

# useradd -U -m acme

允许acme 用户重新配置Gitlab,以便它可以更新证书:

# echo "acme ALL=(ALL) NOPASSWD: /usr/bin/gitlab-ctl reconfigure" >> /etc/sudoers

创建 Gitlab 期望找到 SSL 证书和密钥的目录并授予 acme 写访问权限:

# mkdir /etc/gitlab/ssl
# chgrp acme /etc/gitlab/ssl
# chmod 775 /etc/gitlab/ssl

acme.sh 安装为acme 用户

# su - acme
$ curl -s https://get.acme.sh | sh -s email=you@example.com

获取证书(LuaDNS 示例,其他类似 - 参见文档)

$ export LUA_Key="<my api-key>"
$ export LUA_Email="<my email>"
$ ~/.acme.sh/acme.sh --issue --dns dns_lua -d gitlab.example.com \
                     --challenge-alias acme.example.com

(这也设置了一个 crontab 条目以每 60 天自动更新证书)

安装证书

$ ~/.acme.sh/acme.sh --install-cert -d gitlab.example.com \
                     --key-file /etc/gitlab/ssl/gitlab.example.com.key \
                     --fullchain-file /etc/gitlab/ssl/gitlab.example.com.crt \
                     --reloadcmd "sudo gitlab-ctl reconfigure"

注意/etc/gitlab/ssl下的文件名必须与你的gitlab url命名相同,并且必须使用key作为密钥扩展名和crt作为证书。另请注意,证书包含完整的证书链。这些都是 Gitlab 所期望的。

如果您有 Gitlab Runner,则需要使用新的 https://gitlab.example.com 端点重新注册它们。

【讨论】:

以上是关于如何使用 gitlab 加密?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 gitlab-ci 作业推送到 gitlab 存储库?

如何在一台机器上使用 GitLab 和 Gitlab-Mattermost?

如何使用 Gitlab CI 构建 Java Maven 项目?

如何配置 gitlab 以使用现有的 postgres 服务器

如何使用柯南遥控器配置 gitlab-runner?

如何使用 gitlab-ci.yml 在 gitlab 中更新 JSON 文件的内容?