SSL 配置

可用的 SSL 配置任务

Omnibus 提供几种 SSL 配置的常见用例。

https

Host Services

管理员可以通过任何极狐GitLab 服务支持的方法,启用安全的 http 服务。

服务 手动 SSL Let’s Encrypt
Primary GitLab Instance Domain
Container Registry
Mattermost
GitLab Pages No

集成 Let’s Encrypt

极狐GitLab 可以与 Let’s Encrypt 集成。

主 GitLab 实例

external_url
note为了让 Let’s Encrypt 验证自动工作,运行验证检查的公共 Let’s Encrypt 服务器需要可以访问端口 80 和 443。验证不适用于非标准端口。 如果环境是私有的或隔离的,certbot 为自定义安装实例生成证书提供手动方法。
/etc/gitlab/gitlab.rbletsencrypt['enable'] = false
/etc/gitlab/gitlab.rb
letsencrypt['enable'] = true                      # GitLab 10.5 and 10.6 require this option
external_url "https://gitlab.example.com"         # Must use https protocol
letsencrypt['contact_emails'] = ['foo@email.com'] # Optional
contact_emails

GitLab 组件

/etc/gitlab/gitlab.rb
registry_external_url "https://registry.example.com"     # container registry, must use https protocol
mattermost_external_url "https://mattermost.example.com" # mattermost, must use https protocol
#registry_nginx['ssl_certificate'] = "path/to/cert"      # Must be absent or commented out
gitlab.example.comregistry.example.com

Let’s Encrypt 自动更新

/etc/gitlab/gitlab.rbletsencrypt['enable'] = falsegitlab-ctl reconfigure
external_urlLet's Encrypt
/etc/gitlab/gitlab.rb
# This example renews every 7th day at 12:30
letsencrypt['auto_renew_hour'] = "12"
letsencrypt['auto_renew_minute'] = "30"
letsencrypt['auto_renew_day_of_month'] = "*/7"
note仅当证书将在 30 天后到期时才会更新。例如,如果您将其设置为每月 1 日 00:00 更新,并且证书在 31 日到期,则证书将在更新之前到期。
/etc/gitlab/gitlab.rb
letsencrypt['auto_renew'] = false

Let’s Encrypt 手动更新

使用以下命令中的 一个 手动更新 Let’s Encrypt 证书:

sudo gitlab-ctl reconfigure
sudo gitlab-ctl renew-le-certs
/etc/gitlab/gitlab.rbletsencrypt['enable'] = false

连接外部资源

https

默认配置

Omnibus 附带了官方的 CAcert.org 可信根证书颁发机构集合,用于验证证书的真实性。

其它证书颁发机构

Omnibus 支持使用自签名证书连接到外部服务。

note对于使用自签名证书的安装实例,Omnibus 提供了一种管理这些证书的方法。有关其工作原理的更多技术细节,请参阅本页底部的详细信息。

安装自定义公共证书

c_rehash
/etc/gitlab/trusted-certsgitlab-ctl reconfigure
c_rehash/etc/gitlab/trusted-certs

故障排查

有用的 OpenSSL 调试命令

有时,通过直接在源中查看 SSL 证书链,可以更好地了解它是有帮助的。这些命令是用于诊断和调试的标准 OpenSSL 工具库的一部分。

noteGitLab 包括所有 GitLab 库都链接到的自定义编译版本的 OpenSSL,使用此 OpenSSL 版本运行以下命令很重要。
echo | /opt/gitlab/embedded/bin/openssl s_client -connect HOSTNAME:port
/opt/gitlab/embedded/bin/openssl x509 -in /path/to/certificate.crt -text -noout
echo | /opt/gitlab/embedded/bin/openssl s_client -connect HOSTNAME:port | /opt/gitlab/embedded/bin/openssl x509 -text -noout

常见的 SSL 错误

golang 编写的 Git-LFS 等嵌入式服务报告未知机构签名的自定义证书

gitlab-workhorse
/etc/gitlab/gitlab.rb
gitlab_workhorse['env'] = {
  'SSL_CERT_DIR' => '/opt/gitlab/embedded/ssl/certs/'
}
/opt/gitlab/

证书导致重新配置失败

ERROR: Not a certificate: /opt/gitlab/embedded/ssl/certs/FILE. Move it from /opt/gitlab/embedded/ssl/certs to a different location and reconfigure again.
/opt/gitlab/embedded/ssl/certsREADME.md
gitlab-ctl reconfigure/opt/gitlab/embedded/ssl/certs//opt/gitlab/embedded/ssl/certs//opt/gitlab/embedded/ssl/certs/cacert.pemREADME.md/etc/gitlab/trusted-certs/

丢失或跳过自定义证书

/etc/gitlab/ssl/trusted-certs//etc/gitlab/trusted-certs/gitlab-ctl reconfigure
/opt/gitlab/embedded/ssl/certs/gitlab-ctl reconfigurecert.pem
/etc/gitlab/trusted-certs/TRUSTED

使用以下命令测试证书的有效性:

/opt/gitlab/embedded/bin/openssl x509 -in /etc/gitlab/trusted-certs/example.pem -text -noout
/opt/gitlab/embedded/bin/openssl x509 -inform DER -in /etc/gitlab/trusted-certs/example.der -text -noout

无效的证书文件会产生以下输出:

unable to load certificate
140663131141784:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:701:Expecting: TRUSTED CERTIFICATE
c_rehash
$ /opt/gitlab/embedded/bin/c_rehash /etc/gitlab/trusted-certs
bash: /opt/gitlab/embedded/bin/c_rehash: /usr/bin/perl: bad interpreter: No such file or directory

如果您看到此消息,则需要使用发行版的包管理器安装 perl。

TRUSTED
-----BEGIN TRUSTED CERTIFICATE-----
...
-----END TRUSTED CERTIFICATE-----
TRUSTEDgitlab-ctl reconfigure

未检测到自定义证书

gitlab-ctl reconfigure
/opt/gitlab/embedded/ssl/certs//etc/gitlab/trusted-certs/

您可能会遇到 Omnibus 认为已添加自定义证书的问题。

要解决,请删除受信任的证书目录哈希:

rm /var/opt/gitlab/trusted-certs-directory-hash
gitlab-ctl reconfigure

Let’s Encrypt 证书由未知机构签署

Let’s Encrypt 集成的初始实现仅使用证书,而不是完整的证书链。

现在使用完整的证书链。对于已经在使用证书的安装,在续订逻辑指示证书即将到期之前不会发生切换。要尽快强制执行,请运行以下命令:

rm /etc/gitlab/ssl/HOSTNAME*
gitlab-ctl reconfigure

其中 HOSTNAME 是证书的主机名。

重新配置时 Let’s Encrypt 失败

重新配置时,Let’s Encrypt 可能会在以下常见情况下失败:

letsencrypt_certificate[gitlab.domain.com] (letsencrypt::http_authorization line 3) had an error: RuntimeError: acme_certificate[staging]  (/opt/gitlab/embedded/cookbooks/cache/cookbooks/letsencrypt/resources/certificate.rb line 20) had an error: RuntimeError: [gitlab.domain.com] Validation failed for domain gitlab.domain.com
letsencrypt_certificate[gitlab.domain.net] (letsencrypt::http_authorization line 5) had an error: RuntimeError: acme_certificate[staging]   (/opt/gitlab/embedded/cookbooks/cache/cookbooks/letsencrypt/resources/certificate.rb line 25) had an error: RuntimeError: ruby_block[create certificate for gitlab.domain.net] (/opt/gitlab/embedded/cookbooks/cache/cookbooks/acme/resources/certificate.rb line 108) had an error: RuntimeError: [gitlab.domain.com] Validation failed, unable to request certificate

您可以使用 Let’s Debug 诊断工具测试您的域名。它可以帮助您找出无法颁发 Let’s Encrypt 证书的原因。

GitLab 和 SSL 的工作实现细节

/opt/gitlab/embedded/ssl/certs
/etc/gitlab/trusted-certs//opt/gitlab/embedded/ssl/certscustomcacert.pem/etc/gitlab/trusted-certs/
$ sudo ls -al /opt/gitlab/embedded/ssl/certs
total 272
drwxr-xr-x 2 root root   4096 Jul 12 04:19 .
drwxr-xr-x 4 root root   4096 Jul  6 04:00 ..
lrwxrwxrwx 1 root root     42 Jul 12 04:19 7f279c95.0 -> /etc/gitlab/trusted-certs/customcacert.pem
-rw-r--r-- 1 root root 263781 Jul  5 17:52 cacert.pem
-rw-r--r-- 1 root root    147 Feb  6 20:48 README
7f279c95

当我们发出 HTTPS 请求时会发生什么?让我们以一个简单的 Ruby 程序为例:

#!/opt/gitlab/embedded/bin/ruby
require 'openssl'
require 'net/http'

Net::HTTP.get(URI('https://www.google.com'))

以下是屏幕后面发生的事情:

openssl/opt/gitlab/embedded/lib/ruby/2.3.0/x86_64-linux/openssl.soNet::HTTP/opt/gitlab/embedded/ssl/certs/cacert.pem
SSL_CERT_FILESSL_CERT_DIR
gitlab_rails['env'] = {"SSL_CERT_FILE" => "/usr/lib/ssl/private/customcacert.pem"}