概要
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コマンドで直接パッケージマネージャーを入れた方がいい気はします…)