重要なお知らせ: sda1.netのメールアドレスを送信元として詐称するスパムについて

nodeのcorepackを使おうとすると Cannot find matching keyid になる問題の対処法

Posted on Feb 8, 2025

概要

  • corepack enableや、pnpm installなどを実行すると以下のようなエラーが出て失敗する
/usr/local/lib/node_modules/corepack/dist/lib/corepack.cjs:21535
  if (key == null || signature == null) throw new Error(`Cannot find matching keyid: ${JSON.stringify({ signatures, keys })}`);
                                              ^

Error: Cannot find matching keyid: {"signatures":[{"sig":"MEQCIBfxS9RKPsi46jxBHnsGYQ03mg8um110415vE6KRCzY8AiBvik66sYxJ/NyCovwJSbDuuoaYCxc7EVdFhaaciIXjTw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"keys":[{"expires":null,"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","keytype":"ecdsa-sha2-nistp256","scheme":"ecdsa-sha2-nistp256","key":"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE1Olb3zMAFFxXKHiIkQO5cJ3Yhl5i6UPp+IhuteBJbuHcA5UogKo0EWtlWwW6KSaKoTNEYL7JlCQiVnkhBktUgg=="}]}
    at verifySignature (/usr/local/lib/node_modules/corepack/dist/lib/corepack.cjs:21535:47)
    at fetchLatestStableVersion (/usr/local/lib/node_modules/corepack/dist/lib/corepack.cjs:21553:5)
    at process.processTicksAndRejections (node:internal/process/task_queues:105:5)
    at async fetchLatestStableVersion2 (/usr/local/lib/node_modules/corepack/dist/lib/corepack.cjs:21672:14)
    at async Engine.getDefaultVersion (/usr/local/lib/node_modules/corepack/dist/lib/corepack.cjs:22292:23)
    at async Engine.executePackageManagerRequest (/usr/local/lib/node_modules/corepack/dist/lib/corepack.cjs:22390:47)
    at async Object.runMain (/usr/local/lib/node_modules/corepack/dist/lib/corepack.cjs:23096:5)

原因

このIssueによくまとまってますが、簡単に言えばnpmが署名に使ってる鍵がローテーションしたもののcorepackでは鍵がハードコードされていたため認証に失敗するようになってしまったとのことです。 いやそんくらい想定しとけよとは思いますが 長らく変わってなかったので想定されてなかったということでしょうか…

対策

とりあえず起動させる必要がある人用: corepackの署名検証を無効にする (セキュリティ上の問題あり、応急処置向け)

以下のような環境変数を設定することでとりあえず回避することができます。

COREPACK_INTEGRITY_KEYS=0

Dockerコンテナが起動しないときに応急処置として使うのには最適です。
ただしこの方法にはセキュリティ上の問題があるためプロジェクトでの解決策として使うのはおすすめできません。

方法1: corepackをやめる

そもそもcorepack自体node本体に同梱されなくなるとか非推奨とかそういう話があるため、この際やめてしまうのも手だと思います。
CIのような環境を汚しても特に問題ない環境ではcorepack関係のコマンドを削除して、npm install -g pnpmといったコマンドでnpmから直接pnpmやyarnなどを落とすようにしていまいましょう。

私も実際にCI環境ではこの方法を使いました。

before
      - name: Enable corepack
        run: corepack enable   ←(もし明示的にcorepack enableしているならそれを削除)

      - name: Install dependencies
        run: pnpm install
after
      - name: Install pnpm
        run: corepack disable && npm install -g pnpm

      - name: Install dependencies
        run: pnpm install

方法2: corepackのバージョンを最新版(≥ 0.31.0)に上げる

これでも解決できます。以下のコマンドを実行してcorepackを最新版にアップデートしましょう。

npm install -g corepack@latest

(どうせnpm install -gするならcorepack使わずに普通にnpmコマンドで直接パッケージマネージャーを入れた方がいい気はします…)