当我偶然发现let's encrypt时,我开始研究SSL证书,并希望将其与GitLab一起使用。但是由于GitLab运行在树莓派2上并且目前运行得非常完美(所以我不想弄乱任何东西),我该如何正确安装let's encrypt SSL证书呢? 附注:我的安装是Omnibus。
当我偶然发现let's encrypt时,我开始研究SSL证书,并希望将其与GitLab一起使用。但是由于GitLab运行在树莓派2上并且目前运行得非常完美(所以我不想弄乱任何东西),我该如何正确安装let's encrypt SSL证书呢? 附注:我的安装是Omnibus。
目前为止我能找到的最好的解决方案是在这篇博客文章中描述的。我不会复述所有内容,但关键点如下:
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证书。
gitlab-ctl reconfigure
不是必要的,因为配置本身并没有改变,但为了让 nginx(和可能的其他组件)获取新证书,应该执行 gitlab-ctl restart
。可能只需要执行 gitlab-ctl restart nginx
。 - rkallenseemattermost_nginx ['custom_gitlab_mattermost_server_config']
。 - Jakob Lenfersgrep 'external_url' /etc/gitlab/gitlab.rb
来检查网站名称。例如https://gitlab.example.com:50000.https
开头,请更改为以https
开头。<your domain name>
。/etc/letsencrypt/live/<your domain name>/
复制证书/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
。external_url 'https://gitlab.yoursite.com'
(如marcolz已经提到的)。 如果您的Gitlab主机不能被Let´s Encrypt服务器外部访问,整个过程会变得更加困难!那么你就不得不放弃像Gitlab Omnibus这样轻松自动化的方式。 现在你绝对需要自己获取Let´s Encrypt证书! 有一些方法可以无需外部可访问的服务器获取Let´s Encrypt证书。Omnibus-gitlab可以自动为您获取和更新来自Let's Encrypt的证书。
dns-challenge
。这是唯一的一种方式,您不需要外部可访问的服务器 - 但您需要“拥有”某个域名,例如gitlab.yoursite.com
和需要访问托管域名的DNS提供商的API(在此处找到支持的DNS提供商列表)。/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
。/etc/gitlab/ssl
目录,并在/etc/gitlab/gitlab.rb
中将外部URL设置为https,具体操作请参考:https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/doc/settings/nginx.md
letsencrypt
的standalone
模式gitlab-shell
可读的证书副本如果您的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所需的。