エラーメッセージ
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:」が付きます。
発生する理由
鍵のローテーションとキャッシュされた鍵セット
よくあるプロバイダーが新しい鍵で署名を始めました。jwks-rsa は未知の `kid` を受け取ると鍵セットを取得し直しますが、それはキャッシュとレート制限の設定が許す場合に限られます。キャッシュ期間を非常に長くして作成したクライアントや、手動でコピーした鍵を使っている場合は、再起動するまで失敗し続けます。
JWKS の URL が別のテナントや環境のもの
よくあるAuth0 のテナント、Cognito のユーザープール、Entra ID のテナント、Keycloak のレルムは、それぞれ独自の鍵セットを持っています。本番環境でステージングの `jwksUri` を使うと、一見正しそうでも値の異なる `kid` を持つ鍵が返されます。
一致する鍵が除外された
ときどきjwks-rsa が対象にするのは、`use` がないか `"sig"` で、`kty` が RSA、EC、OKP のいずれかであり、公開鍵としてインポートできる鍵だけです。`use: "enc"` 付きで公開された鍵や不正な形式の JWK は、`kid` が一致していても何も通知されずにスキップされます。
トークンを別のプロバイダーが発行した
ときどき別の ID プロバイダーのトークン(またはテスト用にローカルで発行したトークン)は、このプロバイダーが一度も公開していない鍵を指定しています。鍵をデバッグする前に、ペイロードの `iss` を確認してください。
修正方法
- 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.
キャッシュとレート制限を設定したクライアントを 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, });
関連するエラー
no applicable key found in the JSON Web Key Setjose (JavaScript)Unable to find a signing key that matches: "2026-10"PyJWT (Python)IDX10503: Signature validation failed. The token's kid is: '2026-10', but did n…Microsoft.IdentityModel.JsonWebTokens / System.IdentityModel.Tokens.Jwt (.NET)Jwks doesn't have key to match kid or alg from JwtEnvoy / Istio