本文へスキップ
ecdsa.com
golang-jwt/jwt (Go)Go

エラーメッセージ

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` として報告するため、署名が不正であるかのように見えますが、実際にはアルゴリズムのポリシーによる拒否です。

発生する理由

修正方法

  1. 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. 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"])
    }

関連するエラー

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