エラーメッセージ
error Error: unable to get local issuer certificate
別の表記
- YN0001: RequestError: unable to get local issuer certificate
Yarn 1.x は「error Error: unable to get local issuer certificate」と出力し、続けて Node.js のスタックトレースを表示します。レジストリがリーフ証明書しか送信しない場合は、代わりに「unable to verify the first certificate」と表示されます。
このエラーの意味
Yarn Classic はレジストリから証明書チェーン(リーフ証明書と中間証明書)を受け取りましたが、Node.js はその上位にあるルートを信頼していません。Yarn は Node.js のエラーをそのまま表示します。通常、レジストリ側に問題はなく、チェーンの行き着く先にある社内またはプロキシのルートがこのマシンにないことが原因です。
発生する理由
社内 CA が署名した証明書を使うプライベートレジストリ
よくある社内 CA が発行した証明書を使う Artifactory、Nexus、Verdaccio で、その CA のルートを Node.js が知らないケースです。
発行元の中間証明書を送信する、TLS を検査するプロキシ
よくあるリーフ証明書と中間証明書は送信するもののルートは送信しないプロキシでは、「self-signed certificate in certificate chain」ではなく、このコードが出ます。
ロックファイルが別のレジストリホストを指している
ときどきyarn.lock には tarball の完全な URL が保存されています。プライベートミラーを使って作成されたロックファイルは、レジストリの設定を変更しても、そのホストからダウンロードし続けます。
修正方法
- 1.
Yarn 1 の cafile を設定する
Yarn に社内のルートを指定してください(cafile はレジストリへのリクエストでデフォルトのルートを置き換えるため、パブリックルートも含めたバンドルを指定する方法もあります)。
bash yarn config set cafile /etc/ssl/private-ca/corp-root-ca.pem - 2.
または NODE_EXTRA_CA_CERTS を使う
Yarn と、この変数が設定されたその他すべての Node.js プロセスについて、Node.js の組み込みリストにルートを追加します。
bash export NODE_EXTRA_CA_CERTS=/etc/ssl/private-ca/corp-root-ca.pem yarn install --frozen-lockfile - 3.
Yarn 4:httpsCaFilePath
Yarn 4 はこの失敗を「YN0001: RequestError: unable to get local issuer certificate」と表示し、CA ファイルは .yarnrc.yml の httpsCaFilePath から読み込みます。
yaml # Yarn 4: .yarnrc.yml httpsCaFilePath: /etc/ssl/private-ca/corp-root-ca.pem - 4.
ロックファイルが使っているホストを確認する
resolved の URL が社内のミラーを指している場合、修正すべきなのはレジストリの設定ではなく、そのミラーの証明書かトラストストアです。
bash # Which hosts does the lockfile download from? grep -oE 'resolved "https://[^/]+' yarn.lock | sort | uniq -c