本文へスキップ
ecdsa.com
Node.js start-upNode.js の crypto

エラーメッセージ

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 の理由テキストでわかります。

発生する理由

修正方法

  1. 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. 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. 3.

    絶対パスを使う

    環境変数を設定する時点でパスを展開しておき、作業ディレクトリやシェルの展開に依存しないようにしてください。

    bash
    # Absolute path, expanded by the shell before node starts
    export NODE_EXTRA_CA_CERTS="$HOME/certs/corp-root-ca.pem"
  4. 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

関連するエラー

署名エラーデータベースをすべて見る