本文へスキップ
ecdsa.com
jsonwebtoken (Node.js)JWT ライブラリ

エラーメッセージ

invalid signature

このエラーの意味

トークンは問題なく解析でき、構造も有効ですが、暗号学的なチェックに失敗しました。header.payload に対する署名を、指定した鍵で検証できません。その鍵がトークンに署名した鍵ではないか、署名されたバイト列が署名後に変更されたかのどちらかです。

発生する理由

修正方法

  1. 1.

    両側で鍵のフィンガープリントを取る

    検証者が実際に読み込んだ公開鍵をハッシュし、発行者側の公開鍵のハッシュと比較してください。フィンガープリントが異なれば、圧倒的に多い原因である古い鍵または誤った鍵ということになり、一度で原因の特定が終わります。

    js
    import { createHash, createPublicKey } from "node:crypto";
    
    // Run on the verifier, and on the issuer with its signing key: the outputs must match.
    const spki = createPublicKey(process.env.JWT_PUBLIC_KEY).export({ type: "spki", format: "der" });
    console.log(createHash("sha256").update(spki).digest("hex"));
  2. 2.

    トークンの kid と検証用の鍵を照合する

    検証せずにヘッダーをデコードし、その kid を手元の鍵と比較してください。発行者が JWKS を公開している場合は、鍵をハードコードするのではなく、kid で鍵を選んでください。

    js
    const { header } = jwt.decode(token, { complete: true });
    console.log(header.kid, header.alg); // compare with your JWKS / configured key
  3. 3.

    デバッガーで不一致の種類を特定する

    トークンと公開鍵を JWT デバッガーに貼り付けてください。ES256/ES384/ES512 をローカルで検証し、単なる真偽値ではなく、鍵の誤り、ペイロードの改ざん、署名のエンコーディングの不備を区別して示します。

関連するエラー

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