如何使用 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 开始)是添加一个 s 到http 在 /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 项目?