Docker 用の Ubuntu イメージ は最低限のパッケージがインストールされていない。そのため、SSL/TLS 通信を行おうとすると以下のメッセージが出るだろう。 (以下は curl の場合)
curl: (60) SSL certificate problem: unable to get local issuer certificate
ここでは「その場しのぎのやり方」と「根本的な対処」と「なぜそんなことが起こりえるのか」の3つにわけて説明する。
その場しのぎのやり方
ここでは SSL/TLS 通信の使用頻度が高い代表的なプログラムの3つを取り上げて説明する。
- git
- curl
- wget
git の場合
http.sslVerify
を無効にする。
$ git config --global http.sslVerify false
$ git clone https://git.example.com/some/repository.git
元に戻す場合は http.sslVerify
を true
にする。
curl の場合
-k
をつけて実行する。
$ curl -k https://example.com
wget の場合
--no-check-certificate
をつけて実行する。
$ wget --no-check-certificate https://example.com
根本的な対処
そもそも今回のエラーは CA の証明書が入っていないことが原因のエラーであり、Ubuntu イメージには CA の証明書が入ってない。
Docker イメージの構築段階、あるいはイメージ上で実行するスクリプトに
CA の証明書のパッケージをインストールすればよい。
$ apt-get install ca-certificates
これで「その場しのぎのやり方」をせずとも通常に SSL/TLS 通信が可能になる。
なぜそんなことが起こりえるのか?
通常 ca-certificates
は推奨パッケージとして「その場しのぎのやり方」で取り上げたプログラムと共にインストールされる。
Recommended packages:
ca-certificates
ところが apt-get
に --no-install-recommends
を明示的につけると ca-certificates
がインストールされなくなる。そのために起こるエラーである。