我如何使用 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、大型云服务器或介于两者之间的东西),有两种方法:
如果你有一个外部可访问的服务器(意味着你的 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.
如果 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
中的文档所述
如果您的 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 端点重新注册它们。
当我偶然发现 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
的 - 使证书的副本可供
gitlab-shell
读取
standalone
模式
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、大型云服务器或介于两者之间的东西),有两种方法:
如果你有一个外部可访问的服务器(意味着你的 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.
如果 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 likegitlab.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
中的文档所述
如果您的 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 端点重新注册它们。