Message d’erreur
go-jose/go-jose: error in cryptographic primitive
Également affiché sous la forme
- square/go-jose: error in cryptographic primitive
go-jose v2 (importé sous gopkg.in/square/go-jose.v2) utilisait le préfixe « square/go-jose: » ; les versions v3 et v4 utilisent « go-jose/go-jose: ». La même erreur est renvoyée pour les échecs de déchiffrement JWE.
go-jose (Go) — jose.ErrCryptoFailure from JSONWebSignature.Verify / jwt.JSONWebToken.Claims
Ce que cela signifie
L’échec générique de signature (ou de déchiffrement) de go-jose, `jose.ErrCryptoFailure`. Le JWS a été analysé et l’algorithme était autorisé, mais la vérification de la signature avec la clé fournie a échoué. go-jose n’en dit volontairement pas plus – pour un vérificateur, une mauvaise clé et un jeton modifié se ressemblent –, si bien que l’enquête revient toujours à ceci : quelle clé avez-vous fournie, et le jeton a-t-il été modifié ?
Pourquoi cela se produit
La clé n’appartient pas au signataire
fréquenteUne clé d’un autre environnement ou d’un autre locataire, ou une clé publique remplacée par l’émetteur lors d’une rotation.
Le jeu de clés a été parcouru sans kid
fréquenteLe code qui prend `keys.Keys[0]` au lieu de `keys.Key(kid)` vérifie avec la première clé du jeu. Cela fonctionne jusqu’à ce que l’émetteur publie une seconde clé.
En-tête ou charge utile modifiés
occasionnelleLa signature couvre exactement les octets base64url. Resérialiser la charge utile, ou combiner des parties de deux jetons, fait échouer la vérification.
Déchiffrement avec la mauvaise clé privée
occasionnellePour les jetons JWE, la même erreur signifie que la clé de chiffrement du contenu n’a pas pu être désencapsulée ou que la vérification du tag d’authentification a échoué : le jeton a été chiffré pour une autre clé de destinataire.
Comment corriger l’erreur
- 1.
Sélectionner la clé par kid, puis valider les claims
Résolvez exactement une clé à partir du `kid` de l’en-tête dans le JWKS de l’émetteur, vérifiez la signature, puis validez `iss`, `aud` et `exp` avec `Claims.Validate` : go-jose ne vérifie pas les claims de lui-même.
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()})