Zum Inhalt springen
ecdsa.com
go-jose (Go)Go

Fehlermeldung

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

Auch ausgegeben als

  • square/go-jose: error in cryptographic primitive

go-jose v2 (importiert als gopkg.in/square/go-jose.v2) verwendete das Präfix „square/go-jose:“; v3 und v4 verwenden „go-jose/go-jose:“. Derselbe Fehler wird auch zurückgegeben, wenn die JWE-Entschlüsselung fehlschlägt.

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

Was der Fehler bedeutet

Der allgemeine Fehler von go-jose bei der Signaturprüfung (oder Entschlüsselung), `jose.ErrCryptoFailure`. Die JWS ließ sich parsen, und der Algorithmus war erlaubt, aber die Prüfung der Signatur mit dem übergebenen Schlüssel ist fehlgeschlagen. go-jose sagt absichtlich nicht mehr – ein falscher Schlüssel und ein verändertes Token sehen für die prüfende Seite gleich aus –, deshalb lautet die Frage immer: Welchen Schlüssel hast du übergeben, und wurde das Token verändert?

Warum der Fehler auftritt

So behebst du den Fehler

  1. 1.

    Schlüssel per kid auswählen, dann Claims validieren

    Ermittle über den `kid` aus dem Header genau einen Schlüssel aus dem JWKS des Ausstellers, prüfe die Signatur und validiere dann `iss`, `aud` und `exp` mit `Claims.Validate` – go-jose prüft Claims nicht von sich aus.

    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()})

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen