サマリ
- 会社の独自プロキシ証明書がcer拡張子で配布されていた
- debian系のdocker imageをbuildするのにupdate-ca-certificatesコマンドがうまく動かなかった
-
mv sample.cer sample.crt
したら動いた
環境
node:16を使っていた。debianのbusterがベース。
$ docker run --rm -it node:16 sh
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
背景
さまざまな情報源に、debianに独自証明書を追加する場合は、以下のどちらかのパスに証明書をおいて update-ca-certificates
コマンドを叩きましょうと書いてある。
/usr/share/ca-certificates
/usr/local/share/ca-certificates
Dockerfile上で以下のようにどちらにも置いてみたが、curlが失敗した。
COPY sample.cer /usr/local/share/ca-certificates/
COPY sample.cer /usr/share/ca-certificates/
RUN update-ca-certificates
暫定対応1
今回はcurlで外部通信を行いたかったので、以下のように .curlrc
に記載することでうまく動いた。
COPY sample.cer /usr/local/share/ca-certificates/
RUN echo "cacert=/usr/local/share/ca-certificates/sample.cer" > ~/.curlrc
暫定対応2
update-ca-certificates
の実行結果としてファイルが移動されるらしいので、移動先に直接置いてみたうえで fresh
オプションを付けることでも、動いた。
COPY sample.cer /etc/ssl/certs/
RUN update-ca-certificates --fresh
恒久対応
node:16
コンテナではmanコマンドが使えなかったため、直接 update-ca-certificates
コマンドの中身を確認することにした。
$ docker run --rm -it node:16 sh
# command -v update-ca-certificates
/usr/sbin/update-ca-certificates
# cat /usr/sbin/update-ca-certificates
以下はコマンドの中身の抜粋だが、 "*.crt"
を探しており、用意していた証明書 "*.cer"
は対象外となっていることがわかる。
CERTSDIR=/usr/share/ca-certificates
LOCALCERTSDIR=/usr/local/share/ca-certificates
find -L "$CERTSDIR" -type f -name '*.crt' | sort | while read crt
find -L "$LOCALCERTSDIR" -type f -name '*.crt' | sort | while read crt
cerもcrtも中身は一緒らしいので、以下のように記載することでうまくいった。
COPY sample.cer /usr/local/share/ca-certificates/
RUN mv /usr/local/share/ca-certificates/sample.cer /usr/local/share/ca-certificates/sample.crt
RUN update-ca-certificates
感想
証明書の種別については以下を参考にさせていただいた。
https://qiita.com/kunichiko/items/12cbccaadcbf41c72735
"*.cer"
はMicrosoftが定めた形式とのこと。より広く使われているcrtを使うべきだということがよくわかった。