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
Der Aussteller hat den Algorithmus gewechselt
häufigIdentity Provider wechseln von RS256 zu ES256 oder fügen EdDSA-Schlüssel hinzu. Prüfende Dienste, die den alten Algorithmus festgelegt haben, lehnen ab dem Moment der Umstellung jedes neue Token ab.
Die Allowlist wurde von einem anderen Dienst kopiert
gelegentlichEine gemeinsam genutzte Middleware, die für einen Aussteller (RS256) konfiguriert ist, wird für einen anderen wiederverwendet, der mit ES256 signiert. Die Allowlist muss den Aussteller beschreiben, der hinter genau dieser prüfenden Seite steht.
Ein Token von anderswo oder eine Sondierung
gelegentlichTokens mit `alg: HS256` oder `none`, die eine API mit RS256/ES256 erreichen, sind typisch für Sondierungen, die auf Algorithm Confusion abzielen. Lehne sie weiterhin ab.
So behebst du den Fehler
- 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.
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"]) }