本文へスキップ
ecdsa.com
jwks-rsa (Node.js)JWKS と鍵のディスカバリ

エラーメッセージ

Unable to find a signing key that matches '2026-10-rotated'

別の表記

  • error in secret or public key callback: Unable to find a signing key that matches '2026-10-rotated'
  • SigningKeyNotFoundError: Unable to find a signing key that matches
  • No KID specified and JWKS endpoint returned more than 1 key

引用符で囲まれた値はトークンの `kid` です(ヘッダーにない場合は `'undefined'`)。コールバックを指定した `jwt.verify()` を通じて使うと、テキストの先頭に「error in secret or public key callback: 」が付きます。`kid` のないトークンを複数の鍵を含むセットで検証すると、「No KID specified and JWKS endpoint returned more than 1 key」で失敗します。

jwks-rsa (Node.js) — SigningKeyNotFoundError, often wrapped by jsonwebtoken or express-jwt

このエラーの意味

jwks-rsa は鍵セットをダウンロードしましたが、使用できる署名鍵のどれも、トークンのヘッダーにある `kid`(引用符で囲まれた値)を持っていませんでした。トークン自体はまったく問題なく有効かもしれません。検証者が、そのトークンに署名した鍵を持っていないだけです。jsonwebtoken の鍵コールバックを通じて jwks-rsa を使っている場合、メッセージの先頭に「error in secret or public key callback:」が付きます。

発生する理由

修正方法

  1. 1.

    公開されている kid を一覧表示する

    トークンのヘッダーをデコードし、その `kid` を `jwksUri` にある鍵と比較してください。`kid` がそこに載っているのにエラーが解消しない場合、その鍵は除外されています。鍵の `use` と `kty` を確認してください。

    bash
    # kids the provider publishes (jwks-rsa ignores keys with use "enc" and non RSA/EC/OKP keys)
    curl -s https://tenant.example.com/.well-known/jwks.json | jq '.keys[] | {kid, kty, use, alg}'
  2. 2.

    キャッシュとレート制限を設定したクライアントを 1 つだけ作成する

    キャッシュを有効にしたモジュールレベルのクライアントは、新しい `kid` が現れると鍵セットを取得し直します。また、攻撃者がランダムな `kid` の値を送ってきたときに、大量のリクエストからプロバイダーを守ります。

    js
    import jwksRsa from "jwks-rsa";
    
    // One client per process; unknown kids trigger a refetch, bounded by the rate limit.
    export const jwksClient = jwksRsa({
      jwksUri: "https://tenant.example.com/.well-known/jwks.json",
      cache: true,
      cacheMaxAge: 10 * 60 * 1000,
      rateLimit: true,
      jwksRequestsPerMinute: 10,
    });

関連するエラー

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