エラーメッセージ
IDX10511: Signature validation failed. Keys tried:
別の表記
- Bearer error="invalid_token", error_description="The signature is invalid"
メッセージの残りの部分には、試された鍵(`ShowPII` が有効でない限り `[PII … is hidden]` として非表示)、鍵の数、一致した鍵の取得元、`kid` が列挙されます。
Microsoft.IdentityModel.JsonWebTokens / System.IdentityModel.Tokens.Jwt (.NET) — SecurityTokenInvalidSignatureException
このエラーの意味
IDX10503 とは異なり、トークンの `kid` を持つ鍵は見つかりました(「Matched key was in 'TokenValidationParameters'」または「…'Configuration'」)。それでも、その鍵では署名を検証できませんでした。2 つの異なる鍵が 1 つの鍵 ID を共有しているか、署名後にトークンが変更されたかのどちらかです。ASP.NET Core は `error_description="The signature is invalid"` で応答します。
発生する理由
同じ kid を持つ 2 つの鍵
よくある名前で付けた鍵 ID(`signing-key`、`default`、`rsa1`)は、環境ごとやデプロイごとにそれぞれ独自の鍵を生成すると衝突します。バリデーターは `kid` で鍵を選ぶため、署名の検証が失敗します。
署名後にヘッダーやペイロードが変更された
ときどきゲートウェイによる再エンコード、トリミング、または既存のトークンのクレームを書き換えるテストコードが原因です。
同じ HMAC シークレットから異なるバイト列を作っている
ときどきHS256 と `kid` を使う場合、一方は UTF-8 テキストから鍵を作り、もう一方は base64 デコードしたバイト列から鍵を作っていることがあります。鍵 ID は一致しても、鍵は一致しません。
修正方法
- 1.
サムプリントに基づく鍵 ID を使う
鍵の内容から計算した `kid`(RFC 7638)が衝突するのは、鍵が同一の場合だけです。
csharp // Derive kid from the key itself (RFC 7638 thumbprint) so different keys never share an ID. var jwk = JsonWebKeyConverter.ConvertFromECDsaSecurityKey(new ECDsaSecurityKey(ecdsa)); var key = new ECDsaSecurityKey(ecdsa) { KeyId = Base64UrlEncoder.Encode(jwk.ComputeJwkThumbprint()) }; - 2.
シークレットのバイト列を両側でそろえる
共有シークレットを base64 エンコードして保存し、両側で同じ方法でデコードしてください。
csharp // HS256: issuer and API must build the key from the same bytes. var secret = Convert.FromBase64String(builder.Configuration["Jwt:SecretBase64"]!); // >= 32 bytes var signingKey = new SymmetricSecurityKey(secret);
関連するエラー
IDX10503: Signature validation failed. The token's kid is: '2026-10', but did n…Microsoft.IdentityModel.JsonWebTokens / System.IdentityModel.Tokens.Jwt (.NET)Signed JWT rejected: Invalid signatureNimbus JOSE + JWT (Java)failed to verify signature: failed to verify id token signaturecoreos/go-oidc (Go)