エラーメッセージ
token signature is invalid: signing method ES256 is invalid
別の表記
- signing method ES256 is invalid
- token signature is invalid: signing method HS256 is invalid
- token is unverifiable: signing method (alg) is unavailable
v4 は「signing method ES256 is invalid」と出力します。golang-jwt がまったく認識しない `alg` の値(または特別な定数を使わない `none`)の場合は、代わりに「token is unverifiable: signing method (alg) is unavailable」になります。
golang-jwt/jwt (Go) — WithValidMethods rejected the token's alg
このエラーの意味
トークンの `alg` ヘッダーが `jwt.WithValidMethods` で渡したリストに含まれていないため、golang-jwt は Keyfunc を呼び出して鍵を取得する前にトークンを拒否しました。このチェックがあるのは、ヘッダーの内容を攻撃者が操作できるからです。どのアルゴリズムを受け入れるかを決めるのは、トークンではなく検証者です。v5 はこれを `ErrTokenSignatureInvalid` として報告するため、署名が不正であるかのように見えますが、実際にはアルゴリズムのポリシーによる拒否です。
発生する理由
発行者がアルゴリズムを変更した
よくあるID プロバイダーが RS256 から ES256 に移行したり、EdDSA の鍵を追加したりすることがあります。古いアルゴリズムに固定していた検証者は、切り替えの瞬間から新しいトークンをすべて拒否します。
許可リストが別のサービスからコピーされている
ときどきある発行者(RS256)向けに設定された共有ミドルウェアが、ES256 で署名する別の発行者に対して再利用されているケースです。許可リストは、この検証者が対象とする発行者に合わせて記述しなければなりません。
別の発行元のトークン、またはプローブ
ときどきRS256/ES256 の API に `alg: HS256` や `none` のトークンが届くのは、アルゴリズム混同を狙ったプローブの典型です。引き続き拒否してください。
修正方法
- 1.
発行者のアルゴリズムだけを許可する
発行者の JWKS(各鍵の `alg`)またはディスカバリドキュメント(`id_token_signing_alg_values_supported`)を読み取り、それらの値に固定してください。移行期間中は両方を列挙し、`kid` で鍵を選択してください。
go token, err := jwt.Parse(raw, keyfunc, jwt.WithValidMethods([]string{"ES256"}), // what the issuer signs with today jwt.WithIssuer("https://issuer.example.com/"), ) - 2.
Keyfunc でメソッドの型をアサートする
Keyfunc で `t.Method` の具象型をチェックすれば、後で許可リストが広げられても、ECDSA の鍵が ECDSA のアルゴリズム以外で使われることはないと保証できます。
go keyfunc := func(t *jwt.Token) (any, error) { // Belt and braces: the key type must fit the algorithm family. if _, ok := t.Method.(*jwt.SigningMethodECDSA); !ok { return nil, fmt.Errorf("unexpected signing method %v", t.Header["alg"]) } return lookupKey(t.Header["kid"]) }