学んだことや苦労したことを書いていきます。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。
0. はじめに
何かアプリケーションをテストする際に、よく自己証明書を利用すると思います。
例にもれず、自分もHarborを自己証明書を利用してテストしました。
コマンドで証明書の検証をスキップできれば良いですが、個別に設定ファイル等で設定が必要のものもあり、個別の対応は大変なので、今回は自己証明書をルート証明書として登録することにしました。
環境
Harborサーバー
OS:Ubuntu20.04
k3sバージョン:v1.26.5+k3s1
イメージpush実行サーバー
OS:Ubuntu20.04
Dockerバージョン:24.0.5
1. Harborのデプロイ
今回HarborはHelmを利用してデプロイしました。
本題ではないので、簡単な手順だけ載せておきます。
helm repo add harbor https://helm.goharbor.io
helm repo update
helm show values harbor/harbor > values.yml
vi values.yml #適当に編集
helm install harbor harbor/harbor -f values.yml
2. イメージpush試行
Harborにイメージをデプロイする際には、docker loginコマンドを利用してHarborにログインしてプッシュします。
docker login https://harbor.example.com
Username:[ユーザー名]
Password:[パスワード]
Error response from daemon: Get "https://harbor.example.com/v2/":
tls: failed to verify certificate: x509: certificate signed by unknown authority
証明書エラーがでましたね。
Dockerで証明書の検証をスキップするだけなら設定ファイルに記載でいいのですが、今後Kubernetesでイメージを利用することも考えて、OSにHarborの自己証明書をルート証明書として登録します。
3. 自己証明書の取得
HelmでHarborをデプロイした場合、harbor-ingress
というSecretにca.crtが保存されています。
Secretなのでbase64エンコードもされているので、デコードが必要です。
kubectl get secret
harbor-core Opaque 8
harbor-database Opaque 1
harbor-ingress kubernetes.io/tls 3 # これ
harbor-jobservice Opaque 2
harbor-registry Opaque 2
harbor-registry-htpasswd Opaque 1
harbor-registryctl Opaque 0
harbor-trivy Opaque 2
kubectl get secret harbor-ingress -o jsonpath="{.data.ca\.crt}" | base64 --decode > ca.crt
これで自己証明書が取得できます。
4. 自己証明書をルート証明書として登録
取得した自己証明書を、イメージをpushするサーバーに登録します。
簡単な手段として、catで中身を表示してコピーします。
Harborサーバー
cat ca.crt
イメージをpushするサーバー
vi /etc/ssl/certs/harbor-private.crt
sudo update-ca-certificates
これで証明書が登録されました。
5. Harborにログイン、イメージをプッシュ
再度ログインを試行します。
docker login https://harbor.example.com
Username:[ユーザー名]
Password:[パスワード]
Login Succeeded
無事ログインできました。
ログインさえできれば、イメージのプッシュは通常のプッシュと変わりません。
docker push harbor.example.com/[プロジェクト名]/[リポジトリ名]:[タグ]
0fb012d45c76: Pushed
1ad27bdd166b: Layer already exists
[タグ]: digest: sha256:d8885a73e8a5fcfea3a89770e641069dd207082ce381a58571fc833a9adc3f0e size: 735
プッシュもできましたね。
6. まとめ
検証で自己証明書はよく使われますが、証明書の検証をスキップできないコマンドもあり、操作によっては設定ファイルの書き換えが発生するので、ルート証明書として登録してしまうと非常に楽です。