GitLab の omnibus インストーラーを実行して組織の 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 の順で構成する必要があります。
それは単に 2 つの証明書を同じファイルにまとめることを意味しますか?
とにかく、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"