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での表示だと以下の通り。

centos-ca-trust.png

ここでプルしようとしているレジストリはこちら で構築したプライベートレジストリです。
同じサーバーにコンテナで構築したプライベートレジストリからコンテナイメージをプルするときに、
自己証明書が信頼できないからエラーになっているようですね。
自分で自分が信頼できないとはめんどくさいやつです。

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