Zum Inhalt springen
ecdsa.com
golang-jwt/jwt (Go)Go

Fehlermeldung

token signature is invalid: signing method ES256 is invalid

Auch ausgegeben als

  • signing method ES256 is invalid
  • token signature is invalid: signing method HS256 is invalid
  • token is unverifiable: signing method (alg) is unavailable

v4 gibt „signing method ES256 is invalid“ aus. Ein Wert in `alg`, den golang-jwt überhaupt nicht kennt (oder `none` ohne die spezielle Konstante), ergibt stattdessen „token is unverifiable: signing method (alg) is unavailable“.

golang-jwt/jwt (Go) — WithValidMethods rejected the token's alg

Was der Fehler bedeutet

Der Wert im Header `alg` des Tokens steht nicht in der Liste, die du mit `jwt.WithValidMethods` übergeben hast, deshalb hat golang-jwt das Token abgelehnt, bevor deine Keyfunc nach einem Schlüssel gefragt wurde. Die Prüfung gibt es, weil ein Angreifer den Header frei wählen kann: Den akzeptablen Algorithmus legt die prüfende Seite fest, nicht das Token. v5 meldet den Fehler unter `ErrTokenSignatureInvalid`, wodurch er wie eine fehlerhafte Signatur aussieht – tatsächlich lehnt hier deine Algorithmusrichtlinie das Token ab.

Warum der Fehler auftritt

So behebst du den Fehler

  1. 1.

    Genau den Algorithmus des Ausstellers erlauben

    Lies das JWKS des Ausstellers (`alg` jedes Schlüssels) oder sein Discovery-Dokument (`id_token_signing_alg_values_supported`) und lege genau diese Werte fest. Führe während einer Migration beide auf und wähle die Schlüssel über `kid` aus.

    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.

    Methodentyp in der Keyfunc per Type Assertion prüfen

    Prüfst du in der Keyfunc den konkreten Typ von `t.Method`, ist garantiert, dass ein ECDSA-Schlüssel immer nur mit einem ECDSA-Algorithmus verwendet wird, auch wenn die Allowlist später erweitert wird.

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

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen