以前書いた記事では update-ca-trust を使用しましたが、今回は update-ca-certificates を使用します。事象としては同じで、以下のエラーが出ます。
{ Error: unable to verify the first certificate
at TLSSocket.onConnectSecure (_tls_wrap.js:1047:34)
at TLSSocket.emit (events.js:182:13)
at TLSSocket._finishInit (_tls_wrap.js:629:8) code: 'UNABLE_TO_VERIFY_LEAF_SIGNATURE' }
実験用に Dockerfile を用意します。重要なのは ca-certificates パッケージをインストールする点です。また、NODE_EXTRA_CA_CERTS
環境変数に /etc/ssl/certs/ca-certificates.crt
を指定します。
FROM node:12-alpine
RUN apk add --update ca-certificates
ADD run.sh /run.sh
RUN chmod +x /run.sh
ENV NODE_EXTRA_CA_CERTS=/etc/ssl/certs/ca-certificates.crt
CMD ["/run.sh"]
run.sh は以下のような感じです。update-ca-certificates を実行します。
#!/bin/sh
update-ca-certificates
/bin/sh
上記 Dockerfile をビルドしてイメージを作成します。
中間証明書のダウンロード方法は前回の記事を参考にお願いします。ダウンロードした証明書が .pem の場合、 .crt に変換する必要があります。
openssl x509 -in foo.pem -inform PEM -out foo.crt
用意した .crt を任意のディレクトリに配置します。マウントするので証明書用のディレクトリを作成してください。今回は /srv/ca-certificates/
に配置します。
.crt を配置したディレクトリをコンテナ側の /usr/local/share/ca-certificates/
にマウントします。
podman run -it \
--volume /srv/ca-certificates/:/usr/local/share/ca-certificates/ \
localhost/my-image
コンテナが立ち上がると、run.sh に書いた update-ca-certificates
が実行され、/usr/local/share/ca-certificates/
の中の .crt を含めて1ファイル /etc/ssl/certs/ca-certificates.crt
にまとめてくれます。
以下のコードで接続テストできます。
node -i
https.request('https://www.zu-min.com', (res) => {res.on('data', () => { }); res.on('end', () => { console.log('end') })}).on('error', (e) => { console.log(e) }).end();