【図解付き】開発用オレオレ認証局SSL通信(+dockerコンテナ対応) : 2021


はじめに

オレオレ証明書使ってますか?無料でssl通信ができて便利ですよね。

便利にオレオレしてたのですが、開発用 vm 内に docker コンテナを2つ起動してコンテナ間で https 通信させようとしたら 「怪しい証明局が署名した証明書やろ」 って怒られたので対処方法を記載しておきます。

error.log
# 怪しい証明局が署名したやろエラー
x509: certificate signed by unknown authority

怪しくないオレオレ証明書発行

手順は以下となります。
- オレオレ証明局を作成
- 作成した「オレオレ証明局」を開発用 vm に「信頼できる証明局」として登録
- 「オレオレ証明局」が署名した「オレオレ証明書」を発行

若干めんどくさそうに見えますが、mkcert を利用すると非常に簡単です。
mkcert

mkcert インストール

install.sh
# https://github.com/FiloSottile/mkcert/releases より最新版をダウンロードして実行権限追加
# ubntu の場合
wget https://github.com/FiloSottile/mkcert/releases/mkcert-v1.4.3-darwin-amd64
mv mkcert-v1.4.3-darwin-amd64 mkcert
chmod +x mkcert

/etc/hosts にドメイン登録

127.0.0.1 {domain}

※2021/01/23追記:/etc/hosts にドメイン登録した状態で、mkcert -install しないとダメなようでした。

オレオレ証明局を作成 + 「信頼できる証明局」として登録

mkcert -install

「オレオレ証明局」が署名した「オレオレ証明書」を発行

mkcert -key-file key.pem -cert-file cert.pem {domain}

コンテナ起動時に自己証明局をマウント

この状態で dockerコンテナ間で https 通信を行うと、オレオレ証明局が「信頼できる証明局」として認識されていない状態になり、「怪しい証明局が署名した証明書やろ」 エラーとなります。

これを回避するために、VM の「信頼できる認証局」をコンテナにマウントします。

本番環境ではSSL証明書発行業者によって署名されたSSL証明書を利用するため、この処理は不要となります。
通常のdocker-compose.yaml ではなく、docker-compose.override.yaml に記載しておき、本番環境には docker-compose.override.yaml をコピーしない様にします。

{docker-compose folder}/
 │ docker-compose.yaml
 └ docker-compose.override.yaml # 追加
docker-compose.override.yaml
  # mount 設定を追加
  volumes:
    - /etc/ssl/certs/ca-certificates.crt:/etc/ssl/certs/ca-certificates.crt
docker-run.sh
docker run .... -v /etc/ssl/certs/ca-certificates.crt:/etc/ssl/certs/ca-certificates.crt

おわりに

昔は大変面倒だったことが、簡単にできるようになってきました。
プロジェクトのスリム化が進むと共にフロントエンジニアやインフラエンジニアの境界が曖昧になってきていますので、なるべく簡単に色々な作業をこなせるようにしてより多くの要件を満たせるようにしたいものです。