可用的 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
为了让 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"
仅当证书将在 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 支持使用自签名证书连接到外部服务。
对于使用自签名证书的安装实例,Omnibus 提供了一种管理这些证书的方法。有关其工作原理的更多技术细节,请参阅本页底部的详细信息。
安装自定义公共证书
c_rehash
/etc/gitlab/trusted-certsgitlab-ctl reconfigure
c_rehash/etc/gitlab/trusted-certs
故障排查
有用的 OpenSSL 调试命令
有时,通过直接在源中查看 SSL 证书链,可以更好地了解它是有帮助的。这些命令是用于诊断和调试的标准 OpenSSL 工具库的一部分。
GitLab 包括所有 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"}