本文へスキップ
ecdsa.com
go-jose (Go)Go

エラーメッセージ

go-jose/go-jose: error in cryptographic primitive

別の表記

  • square/go-jose: error in cryptographic primitive

go-jose v2(gopkg.in/square/go-jose.v2 としてインポート)はプレフィックス「square/go-jose:」を使っていましたが、v3 と v4 は「go-jose/go-jose:」を使います。JWE の復号に失敗した場合も、同じエラーが返されます。

go-jose (Go) — jose.ErrCryptoFailure from JSONWebSignature.Verify / jwt.JSONWebToken.Claims

このエラーの意味

go-jose の汎用的な署名(または復号)の失敗を表す `jose.ErrCryptoFailure` です。JWS の解析は成功し、アルゴリズムも許可されていましたが、渡された鍵による署名の検証が失敗しました。go-jose は意図的にこれ以上の情報を示しません。検証者にとって、鍵の誤りとトークンの改変は同じに見えるためです。そのため、調査では常に、どの鍵を渡したのか、トークンが変更されていないかを確認することになります。

発生する理由

修正方法

  1. 1.

    kid で鍵を選択してからクレームを検証する

    ヘッダーの `kid` を使って発行者の JWKS から鍵をちょうど 1 つ特定して検証し、その後 `Claims.Validate` で `iss`、`aud`、`exp` を検証してください。go-jose はクレームを自動ではチェックしません。

    go
    // keys: *jose.JSONWebKeySet fetched from the issuer's jwks_uri
    parsed, err := jwt.ParseSigned(raw, []jose.SignatureAlgorithm{jose.ES256})
    if err != nil {
    	return err
    }
    kid := parsed.Headers[0].KeyID
    matches := keys.Key(kid) // all keys with this kid
    if len(matches) != 1 {
    	return fmt.Errorf("no unique key for kid %q", kid)
    }
    var claims jwt.Claims
    if err := parsed.Claims(matches[0].Key, &claims); err != nil {
    	return err
    }
    return claims.Validate(jwt.Expected{Issuer: "https://issuer.example.com/", AnyAudience: jwt.Audience{"api"}, Time: time.Now()})

関連するエラー

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