エラーメッセージ
Warning: Ignoring extra certs from `/etc/ssl/private-ca/corp-root-ca.pem`, load failed: error:80000002:system library::No such file or directory
パスは環境変数に設定した値です。理由はさまざまで、ファイルがない場合は「No such file or directory」、読み取れない場合は「Permission denied」、ファイルは存在するが PEM 形式ではない場合は OpenSSL の PEM エラーになります。
Node.js start-up — NODE_EXTRA_CA_CERTS could not be read
このエラーの意味
Node.js は起動時に NODE_EXTRA_CA_CERTS を読み取りましたが、そこに指定されたファイルを読み込めなかったため、追加の CA 証明書なしで起動します。プロセスは停止しません。それらの証明書を必要とする接続が、後になって「unable to get local issuer certificate」や「self-signed certificate in certificate chain」で失敗します。理由は「load failed:」の後に続く OpenSSL の理由テキストでわかります。
発生する理由
パスはホストには存在するが、Node.js の実行環境には存在しない
よくある環境変数は Dockerfile、CI の設定、devcontainer にコピーされたものの、証明書ファイルは開発者のマシンに残ったままです。コンテナーやランナーの中には、そのパスが存在しません。
相対パス、または展開されていない ~
よくある./certs/ca.pem のような値はプロセスのカレントディレクトリを基準に解決されます。また、.env ファイルや systemd のユニットに書いた「~/certs/ca.pem」は、どのシェルにも展開されません。
ファイルを読み取れない、または形式が正しくない
ときどきWindows から DER(.cer)としてエクスポートした証明書、root ユーザーしか読み取れないファイル、PEM 証明書以外のものを含むファイルが該当します。
修正方法
- 1.
環境変数が指すファイルを確認する
Node.js を実行するユーザーから見てそのパスが存在すること、そして openssl がそれを PEM 証明書として読み取れることを確認してください。
bash echo "$NODE_EXTRA_CA_CERTS" ls -l "$NODE_EXTRA_CA_CERTS" openssl x509 -in "$NODE_EXTRA_CA_CERTS" -noout -subject # must be PEM: -----BEGIN CERTIFICATE----- - 2.
コンテナー:環境変数と一緒にファイルも含める
環境変数に指定したのと同じパスに、CA 証明書をイメージへコピー(またはマウント)してください。
text # Dockerfile: put the file where the variable points, inside the image COPY corp-root-ca.pem /usr/local/share/ca-certificates/corp-root-ca.crt ENV NODE_EXTRA_CA_CERTS=/usr/local/share/ca-certificates/corp-root-ca.crt - 3.
絶対パスを使う
環境変数を設定する時点でパスを展開しておき、作業ディレクトリやシェルの展開に依存しないようにしてください。
bash # Absolute path, expanded by the shell before node starts export NODE_EXTRA_CA_CERTS="$HOME/certs/corp-root-ca.pem" - 4.
DER を PEM に変換する
NODE_EXTRA_CA_CERTS は PEM 形式を前提としています。バイナリ形式でエクスポートしたものは openssl x509 -inform der で変換してください。1 つの PEM ファイルに複数の証明書を連結できます。
bash # A DER (.cer) export from Windows must be converted to PEM first openssl x509 -inform der -in corp-root-ca.cer -out corp-root-ca.pem