アレについて記す

Docker Registry + Nginxで認証かけたときにつまずいたこと

Posted on March 05, 2015 at 22:08 (JST)

VPSにDocker Registryを構築したときにつまずいた点をメモしておきます。

下記のサイトがとても詳しく書いてくれているので順調に構築できましたが、最後に証明書まわりでつまずきました。

結論から書くと、ベーシック認証かけたregistryへpush/pullするときは、ルート証明書への追加が必要なので注意が必要です。

【環境】

開発マシン(Vagrant1.7.2): CentOS7
公開サーバ(VPS): CentOS6.5
証明書はオレオレです。

エラー内容と対応

nginxとdocker-registryの起動後、ブラウザでアクセス出来ることと認証がかかっていることを確認。
その後、作業用VMから下記コマンドを叩いたところ、エラーとなった。

$ docker push myserver.example.com:5000/centos_jp
FATA[0000] Error: Invalid registry endpoint https://myserver.example.com:5000/v1/: Get https://myserver.example.com:5000/v1/_ping: x509: certificate signed by unknown authority. If this private registry supports only HTTP or HTTPS with an unknown CA certificate, please add --insecure-registry myserver.example.com:5000 to the daemon’s arguments. In the case of HTTPS, if you have access to the registry’s CA certificate, no need for the flag; simply place the CA certificate at /etc/docker/certs.d/myserver.example.com:5000/ca.crt

公開サーバで証明書作ったときのファイルは該当箇所に配備したのになぜ?
下記コマンドでサーバにつながるか確認。

$ curl https://username:password@myserver.example.com:5000 –cacert /etc/docker/certs.d/myserver.example.com:5000/ca.crt
curl: (51) Unable to communicate securely with peer: requested domain name does not match the server’s certificate.

証明書(CRT)を作成するときにCNの設定をミスってました。。。エラーわかりづらい。。。
証明書を作り直して再度トライ。
pushしようとして、認証が必要です!と怒られたので、ログインしようと下記コマンドを実行

$ docker login https://myserver.example.com:5000
FATA[0010] Error response from daemon: Server Error: Post https://myserver.example.com:5000/v1/users/: x509: certificate signed by unknown authority

ブラウザだと認証が通るのにVMからはつながらない症状が発生。
GitHubのISSUESでルート証明書の追加でいけるとの情報発見。

On RHEL you can add your docker registry server cert to the global CA list:
GitHub / Certificate error with “docker login” #10150

下記サイトを参考にルート証明書へ追加。

# update-ca-trust enable
# cp /etc/docker/certs.d/myserver.example.com:5000/ca.crt /etc/pki/ca-trust/source/anchors/
# update-ca-trust extract

上記コマンド実施後、Dockerを再起動して無事ログイン出来ました。
なお、上記方法がCentOS6.5, 7の両方に使用出来ることを確認済みです。

以上です。