如何在GitLab中使用Let's Encrypt?

36

当我偶然发现let's encrypt时,我开始研究SSL证书,并希望将其与GitLab一起使用。但是由于GitLab运行在树莓派2上并且目前运行得非常完美(所以我不想弄乱任何东西),我该如何正确安装let's encrypt SSL证书呢? 附注:我的安装是Omnibus。


这里有一篇不错的文章,适合任何想要在GitLab的免费托管服务上设置此项服务的人使用:https://about.gitlab.com/2016/04/11/tutorial-securing-your-gitlab-pages-with-tls-and-letsencrypt/。 - igneosaur
你也可以在这里查看逐步说明:http://mkkhedawat.com/Enabling-HTTPS-for-Gitlab-pages-using-Certbot/ - mkkhedawat
7个回答

63

目前为止我能找到的最好的解决方案是在这篇博客文章中描述的。我不会复述所有内容,但关键点如下:

  • 使用Let's Encrypt的webroot认证器
  • 创建文件夹/var/www/letsencrypt并将该目录用作Let's Encrypt的webroot-path
  • 更改/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根目录中,并且在Gitlab运行时始终可以进行身份验证。 这意味着您可以自动更新Let's Encrypt证书。


2
@MikeH-R 很好的问题 - 我会说 gitlab-ctl reconfigure 不是必要的,因为配置本身并没有改变,但为了让 nginx(和可能的其他组件)获取新证书,应该执行 gitlab-ctl restart。可能只需要执行 gitlab-ctl restart nginx - rkallensee
1
@waspinator 这也是个好主意,尽管我认为更加优雅的做法是让 Let's Encrypt 验证器不直接写入 GitLab 目录,而是写入它自己的目录。 - rkallensee
1
你可以使用nginx['custom_gitlab_mattermost_server_config']将letsencrypt添加到omnibus mattermost安装中。 - waspinator
1
@rkallensee和@waspinator,您的mattermost配置文件中有一个拼写错误,正确的变量名是 mattermost_nginx ['custom_gitlab_mattermost_server_config'] - Jakob Lenfers
1
@JakobLenfers 谢谢,我已经修改了答案! - rkallensee
显示剩余5条评论

8
我不确定在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证书:将.pem转换为.crt和.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的网站根目录在哪里? - chabad360
我无法识别Webroot。在我的情况下,我一直在使用Apache生成我的证书,并且我相信如果没有使用Apache,则应该使用--standalone(根据https://letsencrypt.org/howitworks/)。但是这可能需要暂时关闭GitLab,我不确定。 - Hay
@Hay或chabad360:你们已经成功整合生成的SSL证书了吗?该证书以PEM格式提供,但Nginx需要*.cert格式。你们是如何处理的呢? - el.severo
我开始对我的答案产生怀疑。也许https://dev59.com/o2Yr5IYBdhLWcg3wXJEK是必要的步骤。老实说,我的答案对我有效,但在特殊情况下,我的文件内容可能会被完全忽略(但它们需要存在于文件系统中)。 - Hay

8
根据您的基础架构设置(Raspi、大型云服务器或介于两者之间),有两种方法可供选择:
  1. 如果您有一个“外部可访问的服务器”(这意味着您的Gitlab主机可被Let's Encrypt服务器调用,这是Let's Encrypt自动验证您“拥有”某个域名(如gitlab.yoursite.com)及其对应的DNS解析服务器/主机所需的机制),则从Gitlab版本10.7开始,“唯一需要”的是在/etc/gitlab/gitlab.rb中的Gitlab URL配置中添加“s”,即:external_url 'https://gitlab.yoursite.com'(如marcolz已经提到的)。
来自https://docs.gitlab.com/omnibus/settings/ssl.html#let-39-s-encrypt-integration的文档中指出:

Omnibus-gitlab可以自动为您获取和更新来自Let's Encrypt的证书。

如果您的Gitlab主机不能被Let´s Encrypt服务器外部访问,整个过程会变得更加困难!那么你就不得不放弃像Gitlab Omnibus这样轻松自动化的方式。 现在你绝对需要自己获取Let´s Encrypt证书! 有一些方法可以无需外部可访问的服务器获取Let´s Encrypt证书。
我选择并推荐的是使用另一个Let's Encrypt客户端dehydrated以及dns-lexicon来完全自动化获得证书的过程,同时使用了Let's Encrypt自2016年引入的dns-challenge。这是唯一的一种方式,您不需要外部可访问的服务器 - 但您需要“拥有”某个域名,例如gitlab.yoursite.com需要访问托管域名的DNS提供商的API(在此处找到支持的DNS提供商列表)。
由于整个过程相当复杂,我创建了一个完全可理解的Ansible playbook prepare-gitlab.yml,其中Gitlab安装的每个步骤都由Omnibus处理(完整的GitHub源代码在这里可用:https://github.com/jonashackt/gitlab-ci-stack)。
如果您只想创建Let´s Encrypt证书,请查看obtain-letsencrypt-certs-dehydrated-lexicon.yml - 即使您不想使用Ansible,您也可以在控制台上手动重现每个步骤或使用其他自动化工具(如Chef或Saltstack)(尽管我个人不能推荐)。另一种方式是参考这篇Lexicon团队的博客文章,我基本上是从中开发了playbook。
无论您选择哪种方法,请不要忘记将手动(或自动)获取的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会自动从那里获取,正如文档在手动配置HTTPS的方式中所述。

1

1
如果对其他人有帮助的话,我在这里写出了我使用的过程: http://kelan.io/2016/using-lets-encrypt-to-add-ssl-to-gitlab/ 我之前已经安装了GitLab(通过源码安装),现在只是想添加SSL,使用Let's Encrypt。
关键点如下:
  • 使用letsencryptstandalone模式
  • 制作一个由gitlab-shell可读的证书副本

0

0

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

本答案假定您使用Gitlab Omnibus安装

如果您不想或无法使用HTTP挑战/响应方法,并希望改用DNS方法,则必须在Gitlab之外执行此操作。一种方法是使用acme.sh而不是Gitlab提供的内置LetsEncrypt支持。

您需要具有受支持API的DNS提供商。如果您的DNS没有API,则可以使用DNS别名和另一个具有受支持API的DNS。我使用了LuaDNS,这对于像这样的轻量级使用是免费的。

不需要重写文档,它就是这样的:

  • 在所选的API DNS上注册并启用其API,需要做任何必要的事情。在LuaDNS上,API必须明确启用,并且您必须验证电子邮件地址才能使API正常工作。请注意API令牌。

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

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

    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容器注册表,则可以省略第3行)

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

    # 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网址同名,并且密钥必须使用key扩展名,证书必须使用crt扩展名。还要注意,证书包含完整的证书链,这是Gitlab所需的。
如果您有Gitlab Runner,请使用新的https://gitlab.example.com端点重新注册它们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接