我正在尝试运行 GitLab 的综合安装程序并使用我组织的 SSL 证书,但 SSL 客户端抱怨证书颁发者未知。我应该如何在信任链中配置中间证书?
我的设置从运行最新版本的 GitLab 开始,公开 HTTPS 和 HTTP 端口等:
sudo docker run --detach --hostname myserver.myorg.org --publish 1443:443 --publish 1080:80 \
--publish 2222:22 --publish 5005:5005 --name gitlab1 \
--volume /srv/gitlab/config:/etc/gitlab \
--volume /srv/gitlab/logs:/var/log/gitlab \
--volume /srv/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce:14.2.3-ce.0
这会在 中创建一堆默认配置/srv/gitlab/config
,因此我去在 中设置服务器的 URL gitlab.rb
:
external_url 'https://myserver.myorg.org'
我从我的组织收到了证书文件和密钥文件,因此我将它们复制到 和 目录中。/srv/gitlab/config/ssl
然后我重新配置 GitLab 服务器:myserver.myorg.org.crt
myserver.myorg.org.key
sudo docker exec -it gitlab1 bash -c "gitlab-ctl reconfigure"
现在我尝试验证 SSL 配置:
echo | gnutls-cli -p1443 myserver.myorg.org
我在输出中收到一堆错误,包括这些:
...
Processed 129 CA certificate(s).
Resolving 'myserver.myorg.org:1443'...
Connecting to '127.0.0.1:1443'...
- Certificate type: X.509
- Got a certificate list of 1 certificates.
...
- Status: The certificate is NOT trusted. The certificate issuer is unknown.
*** PKI verification of server certificate failed...
*** Fatal error: Error in the certificate.
看起来我没有完整的信任链。我们组织的证书颁发者是“CN=DigiCert TLS RSA SHA256 2020 CA1,O=DigiCert Inc,C=US”。我在他们的网站,并下载了特定的一个:
wget https://cacerts.digicert.com/DigiCertTLSRSASHA2562020CA1-1.crt.pem
我提取了证书的文本版本:
openssl x509 -in DigiCertTLSRSASHA2562020CA1-1.crt.pem -text
...
-----BEGIN CERTIFICATE-----
MIIEvjCCA6agAwIBAgIQBtjZBNVYQ0b2ii+nVCJ+xDANBgkqhkiG9w0BAQsFADBh
...
A7sKPPcw7+uvTPyLNhBzPvOk
-----END CERTIFICATE-----
我将其附加到我的组织的证书中,/srv/gitlab/config/ssl/myserver.myorg.org.crt
因此现在它首先具有该组织的证书,然后具有 Digicert 证书。
-----BEGIN CERTIFICATE-----
... our organization's certificate ...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
... Digicert certificate I just downloaded
-----END CERTIFICATE-----
这是我最没有信心的一步。我基于GitLab 说明:
确保使用完整的证书链,以防止客户端连接时出现 SSL 错误。完整证书链的顺序应首先是服务器证书,然后是所有中间证书,最后是根 CA。
这是否仅意味着将两个证书粘贴在同一个文件中?
无论如何,我运行了reconfigure
命令并再次测试:
sudo docker exec -it gitlab1 bash -c "gitlab-ctl reconfigure"
...
echo | gnutls-cli -p1443 myserver.myorg.org
我仍然收到相同的错误,包括“获得 1 个证书的证书列表”。这让我认为我没有正确地将 Digicert 证书添加到链中。我还尝试将 Digicert 证书放在我们组织的证书之前。
为了确保证书有效,我遵循这个帖子。openssl s_server
和openssl s_client
一起工作得很好,所以我认为问题出在我的 GitLab 配置上。
答案1
当我读到GitLab 文档reconfigure
仔细一看,我意识到我误解了和之间的区别hup nginx
。
如果您的 SSL 证书内容已更新,但未对 gitlab.rb 进行任何配置更改,则 gitlab-ctl reconfigure 将不会影响 NGINX。相反,运行 sudo gitlab-ctl hup nginx 以使 NGINX 正常重新加载现有配置和新证书。
我以为reconfigure
会做所有事情,hup nginx
而且还有很多其他事情。但事实证明,reconfigure
如果您没有更改文件中的任何内容,则不会注意到证书文件中的更改/srv/gitlab/config/gitlab.rb
。
将中间证书附加到之后,我通过运行此命令解决了我的问题/srv/gitlab/config/ssl/myserver.myorg.org.crt
:
sudo docker exec -it gitlab1 bash -c "gitlab-ctl hup nginx"