我如何使用 let's encrypt with gitlab?

How do I use let’s encrypt with gitlab?

当我偶然发现 let's encrypt 时,我开始研究 ssl 证书,我想将它与 gitlab 一起使用,但是它是 运行 on a raspberry pi 2并且它的 运行 现在非常完美(所以我不想搞砸任何事情),他会不会我去安装一个 lets encrypt ssl 证书? PS: 我的安装是综合的

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

我不知道 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 安装说明进行操作 link: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

我目前能够找到的最佳解决方案在 this blog post 中进行了描述。我就不一一列举了,重点是:

  • 使用 webroot 验证器进行 Let's Encrypt
  • 创建文件夹 /var/www/letsencrypt 并将此目录用作 Let's Encryptwebroot-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-root 中,并且当 Gitlab 是 运行宁。这意味着您可以自动续订 Let's Encrypt 证书。

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

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

重点是:

  • 使用letsencrypt
  • standalone模式
  • 使证书的副本可供 gitlab-shell
  • 读取

You need to install the generated certificates manually in /etc/gitlab/ssl and set the external url to https in /etc/gitlab/gitlab.rb as described in: https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/doc/settings/nginx.md

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

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

  1. 如果你有一个外部可访问的服务器(意味着你的 Gitlab 主机可以从 Let´s Encrypt 服务器调用,这是 Let´s Encrypt 所需要的验证您 "own" 某个域(如 gitlab.yoursite.com 和相应的 DNS 已解析 server/host)的自动机制 唯一需要的东西 (来自Gitlab version 10.7 on)就是在你的Gitlab URL配置中的http中添加一个s(如marcolz 已经提到):

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

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

Omnibus-gitlab can automatically fetch and renew certificates from Let's Encrypt for you.

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

    我选择并推荐的是使用替代的 Let´s Encrypt 客户端 dehydrated together with the dns-lexicon to fully automate the process of obtaining the certificates together with the Let´s Encrypt dns-challenge, which was introduced somewhere in 2016. This is the only way, where you don´t need an externally accessible server - but you again need to "own" a certain domain like gitlab.yoursite.com AND you need API access to the DNS provider, which hosts your domain (here´s a list of supported DNS providers in that case)。

    由于整个过程相当复杂,我创建了一个完全可以理解的Ansible playbook prepare-gitlab.yml where every step of the Gitlab installation with Omnibus is handled for you (full GitHub sources are available here: https://github.com/jonashackt/gitlab-ci-stack)。

    如果您只想创建 Let´s Encrypt 证书,请查看 obtain-letsencrypt-certs-dehydrated-lexicon.yml - even if you don´t want to use Ansible, you can also manually reproduce every step on the console or use another automation tool like Chef or Saltstack (although I can´t recommend that personally). Another way would be to have a look onto this great blogpost from the lexicon guys: 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

  2. 中的文档所述

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

这个答案是假设 Gitlab Omnibus install.

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

您需要一个支持 API 的 DNS 提供商。如果您的 DNS 没有 API,那么您可以使用 DNS Alias and another DNS that does have a supported API. I used LuaDNS,对于像这样的轻度使用是免费的。

不重写 documentation,它是这样的:

  • 做任何你需要做的事情来在你选择的 API DNS 上注册并启用它的 API。在 LuaDNS 上,必须明确启用 API 并且您必须在 API 工作之前验证您的电子邮件地址。请注意 API 标记。

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

  • 在您的 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 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 Runners,您将需要使用新的 https://gitlab.example.com 端点重新注册它们。