Node.js で中間証明書が設定されていない Web サイトにアクセスする(コンテナ版)


以前書いた記事では 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();

参考


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください