エラーメッセージ
npm error code CERT_HAS_EXPIRED
別の表記
- npm ERR! code CERT_HAS_EXPIRED
- npm error request to https://registry.example.com/lodash failed, reason: certificate has expired
npm 10 以降は「npm error code CERT_HAS_EXPIRED」、npm 9 以前は「npm ERR! code CERT_HAS_EXPIRED」と出力します。続く行には、URL と「reason: certificate has expired」が示されます。
npm (Node.js) — registry request over HTTPS
このエラーの意味
npm がレジストリ(または途中にあるプロキシ)から受け取ったチェーン内のいずれかの証明書が、このマシンの時計で見て有効期限を過ぎています。公開レジストリの場合、npm 自身の証明書が期限切れになったことを意味することはほとんどありません。npm の設定に固定された古い CA、更新されていない Node.js のルートリスト、プロキシの証明書、時計のずれのいずれかを示しています。プライベートレジストリの場合は、サーバーの証明書が実際に期限切れになっている可能性があります。
発生する理由
プライベートレジストリの証明書が期限切れになった
よくある証明書を手作業で更新しているセルフホストの Nexus、Artifactory、Verdaccio のインスタンスや社内プロキシが該当します。
ルートが更新されていない非常に古い Node.js
ときどきNode.js はルートリストをバイナリに含めて配布しています。CA がルートを移行する前のリリースは期限切れのルートしか知らない場合があり、現行のリリースでは成功する接続でも失敗します。
ca または cafile 設定で固定された古い CA
ときどき何年も前に .npmrc に残された ca= や cafile= のエントリは、レジストリへのリクエストについて Node.js のデフォルトのルートを置き換えます。そのため npm は、古く、すでに期限切れになったその証明書を基準に検証し続けます。
システムの時計がずれている
ときどき設定を変更する前に、VM、コンテナー、バッテリーでバックアップされた時計を持たないデバイスの日付を確認してください。
修正方法
- 1.
関係しているレジストリと証明書を確認する
設定されているレジストリと、そのレジストリが返す証明書の有効期限を確認してください。プライベートレジストリの証明書が期限切れの場合は、サーバー側で更新しなければなりません。
bash npm config get registry echo | openssl s_client -connect registry.example.com:443 -servername registry.example.com 2>/dev/null \ | openssl x509 -noout -subject -enddate - 2.
古い ca または cafile 設定を削除する
npm config list は、すべての階層の .npmrc の設定を表示します。古い証明書を指している ca や cafile のエントリを削除してください(または、参照先のファイルを更新してください)。
bash # An old CA pinned in .npmrc replaces the default roots: list and remove it npm config list | grep -E '^;? *(ca|cafile)' npm config delete ca npm config delete cafile - 3.
Node.js と npm をアップグレードする
サポートが継続している Node.js のリリースには、最新のルートリストが含まれています。その後で npm をアップグレードしてください。
bash node -v && npm -v # Node.js bundles its root list; very old releases carry expired roots # upgrade Node.js to a maintained release (nvm, fnm, volta or your OS packages), then: npm install -g npm@latest