エラーメッセージ
The JWKS endpoint did not contain any signing keys
別の表記
- The JWKS endpoint did not contain any keys
jwks-rsa (Node.js) — JwksError from getSigningKey()
このエラーの意味
JWKS エンドポイントは鍵を返しましたが、フィルタリングの結果、署名を検証できる鍵が 1 つも残りませんでした。jwks-rsa が残すのは、`use` が `"sig"` であるか存在せず、`kty` が RSA、EC、OKP のいずれかで、公開鍵として正常にインポートできる鍵だけです。それ以外の鍵(暗号化鍵、共通鍵、不正な形式の JWK、秘密鍵を含む JWK)はすべて破棄されます。よく似たメッセージ「did not contain any keys」は、`keys` 配列そのものが空であるか存在しないことを意味します。
発生する理由
暗号化用の鍵しか公開されていない
よくあるプロバイダーによっては、暗号化鍵(JWE 用)と署名鍵を別々のエンドポイントで公開しています。暗号化鍵の URL を設定すると `use: "enc"` が付いた鍵が返されますが、これらの鍵は決して署名の検証に使ってはいけません。
共通鍵や不明な種類の鍵
ときどき`kty: "oct"` の鍵(決して公開すべきではない HMAC シークレット)だけからなるセットや、jwks-rsa が扱わない種類の鍵は、まるごと除外されます。
秘密鍵を含む JWK や不正な形式の JWK
ときどきインポートに失敗する鍵(`n`/`e` がない、base64url が不正、サポートされていない曲線)は、何も通知されずにスキップされます。`d` を含むために秘密鍵としてインポートされる鍵も同様です。秘密鍵が公開されていること自体も、鍵の危殆化にあたるインシデントです。
URL が別の JSON を返している
ときどきOpenID のディスカバリドキュメントやエラーオブジェクトには `keys` 配列がありません。その場合、jwks-rsa はエンドポイントに鍵が 1 つも含まれていなかったと報告します。
修正方法
- 1.
すべての鍵の kty、use、alg を確認する
jq を 1 行実行するだけで、各鍵が除外される理由がわかります。`has_private: true` の行がある場合、鍵セットから秘密鍵が漏洩しています。その鍵を削除し、ローテーションしてください。
bash curl -s "$JWKS_URI" | jq '.keys[] | {kid, kty, use, alg, crv, has_private: has("d")}' - 2.
署名鍵を少なくとも 1 つ公開する
エンドポイントを自分で運用している場合は、使用中の各署名鍵を `use: "sig"`、一意の `kid`、その鍵の `alg` とともに含めてください。暗号化鍵は、`use: "enc"` が付いていれば同じセットに含めてもかまいません。
json { "keys": [ { "kty": "RSA", "kid": "sig-2026-10", "use": "sig", "alg": "RS256", "n": "…", "e": "AQAB" }, { "kty": "RSA", "kid": "enc-2026", "use": "enc", "alg": "RSA-OAEP-256", "n": "…", "e": "AQAB" } ] }