本文へスキップ
ecdsa.com
Node.js cryptoNode.js の crypto

エラーメッセージ

Invalid JWK EC key

Node.js crypto — TypeError, code ERR_CRYPTO_INVALID_JWK

このエラーの意味

format: "jwk" を指定した createPublicKey/createPrivateKey が JWK オブジェクトを拒否しました。必須のメンバーがないか、座標をデコードできないか、点(x, y)が指定された曲線上に実際には存在しないかのいずれかです。Node はインポート時に点を検証するため、壊れた座標や途中で切れた座標は、決して署名を検証できない鍵になるのではなく、この時点で検出されます。JWK の入手元が JWKS エンドポイントでも、設定ファイルでも、別のサービスでも、同じチェックが実行されます。このエラーが問題にしているのはオブジェクトであり、伝送経路ではありません。

発生する理由

修正方法

  1. 1.

    インポートする前に JWK の形式を検証する

    メンバーとデコード後の長さを確認してください。P-256 では、x と y はそれぞれちょうど 32 バイトにデコードされなければなりません。

    js
    const x = Buffer.from(jwk.x, "base64url");
    const y = Buffer.from(jwk.y, "base64url");
    console.log(jwk.kty, jwk.crv, x.length, y.length); // EC P-256 32 32
  2. 2.

    短い座標の先頭をゼロで埋める

    生成側が先頭のゼロを取り除いていた場合は、JWK を組み立てる前に固定長に戻してください。

    js
    const pad32 = (b) => Buffer.concat([Buffer.alloc(32 - b.length), b]);
    jwk.x = pad32(Buffer.from(jwk.x, "base64url")).toString("base64url");
    jwk.y = pad32(Buffer.from(jwk.y, "base64url")).toString("base64url");
    const key = crypto.createPublicKey({ key: jwk, format: "jwk" });
  3. 3.

    信頼できる入手元から取得し直す

    座標が検証に通らず、JWK を自分で作成したのでもない場合は、バイト列を修復するのではなく、発行者の JWKS エンドポイントから取得し直してください。大がかりな修復が必要な JWK は、信頼すべきではありません。

関連するエラー

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