CentOS7で自己証明書を信頼する方法
オンプレミスに構築したGitLabでCIするときに、以下のエラーが発生しました。
Pulling docker image example.tsuchinokometal.com/pages/php-ci-sample:latest ...
ERROR: Preparation failed: Error response from daemon: Get https://example.tsuchinokometal.com/v2/: x509: certificate signed by unknown authority (docker.go:196:0s)
GitLabでの表示だと以下の通り。
ここでプルしようとしているレジストリはこちら
で構築したプライベートレジストリです。
同じサーバーにコンテナで構築したプライベートレジストリからコンテナイメージをプルするときに、
自己証明書が信頼できないからエラーになっているようですね。
自分で自分が信頼できないとはめんどくさいやつです。
GitLab Runnerのコンテナ内で設定するのかと思いましたが、
どうやらホスト側(今回の場合はCentOS7)で設定するようです。
実際CentOS上でプルしようとしたら同じエラーが表示されます。
[centos@centos ~]$ docker pull example.tsuchinokometal.com/pages/php-ci-sample:latest
Error response from daemon: Get https://example.tsuchinokometal.com/v2/: x509: certificate signed by unknown authority
update-ca-trustコマンドを使う方法
調べてみたところ、update-ca-trustで登録できるようです。
まずは、試した環境です。
[centos@centos ~]$ cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)
[centos@centos ~]$ docker --version
Docker version 19.03.6, build 369ce74a3c
Dockerのドキュメント
を見ると、
以下のコマンドを実行するようですが、僕の環境じゃうまくいきませんでした。
cp certs/domain.crt /etc/pki/ca-trust/source/anchors/myregistrydomain.com.crt
update-ca-trust
そこで、「/etc/pki/ca-trust/source/anchors/」ではなく、
「/etc/pki/tls/certs/」にコピーしたらうまくいきました。
nginxでTLSを使うように設定しているからですかね?
$ sudo cp certs/server.crt /etc/pki/tls/certs/
$ sudo update-ca-trust
$ sudo systemctl restart docker
無事プルできました。
GitLabのジョブもpassedになりました。
[centos@centos gitlab]$ docker pull example.tsuchinokometal.com/pages/php-ci-sample:latest
latest: Pulling from pages/php-ci-sample
ab5ef0e58194: Already exists
09e595793d1e: Already exists
a8815aee6005: Already exists
79c6a430181f: Pull complete
Digest: sha256:f3d7fa93ea9511459055efdd431e048acee03ab09ed9e18b5d9bc40b49183348
Status: Downloaded newer image for example.tsuchinokometal.com/pages/php-ci-sample:latest
example.tsuchinokometal.com/pages/php-ci-sample:latest
おまけ:trustコマンドを使った証明書の管理
こちら
のRedHatのドキュメントにあるtrustコマンドを使うと、
登録した自己証明書の削除が簡単にできました。
$ sudo trust anchor --remove /etc/pki/tls/certs/server.crt
$ sudo rm /etc/pki/tls/certs/server.crt
$ sudo systemctl restart docker
また、trustコマンドで自己証明書の登録は、以下のようにしたらできました。
※自己証明書を/etc/pki/tls/certs/以外に置いていたらうまくいきませんでした。
$ sudo cp certs/server.crt /etc/pki/tls/certs/
$ sudo trust anchor /etc/pki/tls/certs/server.crt
$ sudo systemctl restart docker