Message d’erreur
Jwks doesn't have key to match kid or alg from Jwt
Également affiché sous la forme
- Jwt verification fails
- Jwks remote fetch is failed
Corps de la réponse 401 ; l’en-tête `WWW-Authenticate` contient `error="invalid_token"`. Un fournisseur dont le `remote_jwks` ne peut pas être récupéré répond « Jwks remote fetch is failed ».
Envoy / Istio — envoy.filters.http.jwt_authn (401 response body; Istio RequestAuthentication)
Ce que cela signifie
Le filtre `jwt_authn` d’Envoy (également utilisé par `RequestAuthentication` d’Istio) a cherché dans le JWKS du fournisseur une clé portant le `kid` du jeton et d’un type compatible avec son `alg`, n’en a trouvé aucune et a donc répondu 401 avec ce texte comme corps. La signature n’a jamais été vérifiée. Si une clé correspondante existe mais que la signature ne se vérifie pas, le corps est alors « Jwt verification fails ».
Pourquoi cela se produit
L’émetteur a effectué une rotation de ses clés et le cache d’Envoy est plus ancien
fréquente`remote_jwks` est mis en cache pendant `cache_duration` (5 minutes par défaut). Les jetons signés avec une clé publiée après la dernière récupération échouent jusqu’à l’actualisation du cache.
Une copie du JWKS intégrée ou locale
fréquente`local_jwks` (ou le `jwks:` intégré d’Istio) est un instantané. Il ne découvre jamais les nouvelles clés ; chaque rotation casse l’authentification jusqu’à la mise à jour de la configuration.
La clé portant ce kid est d’un autre type
occasionnelleLe JWKS contient bien le `kid`, mais sous la forme d’une clé RSA alors que le jeton est en ES256 (ou bien l’`alg` de la JWK ne concorde pas). Envoy exige que les deux correspondent.
Le jeton appartient à un autre émetteur
occasionnelleUn fournisseur sans correspondance stricte sur `issuer`, ou une requête portant un jeton d’un autre fournisseur d’identité, est vérifié avec le mauvais jeu de clés.
Comment corriger l’erreur
- 1.
Récupérer le JWKS auprès de l’émetteur
Utilisez `remote_jwks` avec une valeur `cache_duration` raisonnable et une récupération asynchrone, pour que les clés soient présentes avant que des jetons ne les utilisent.
yaml providers: issuer_example: issuer: https://issuer.example.com audiences: ["api://orders"] remote_jwks: http_uri: uri: https://issuer.example.com/.well-known/jwks.json cluster: issuer_jwks # a cluster with TLS to the issuer timeout: 5s cache_duration: 600s async_fetch: { fast_listener: false } # prefetch, and refetch in the background - 2.
Dans Istio, pointer vers jwksUri
Istiod récupère et distribue les clés ; une valeur `jwks` intégrée doit être mise à jour à la main à chaque rotation.
yaml apiVersion: security.istio.io/v1 kind: RequestAuthentication metadata: name: orders-jwt spec: selector: matchLabels: { app: orders } jwtRules: - issuer: https://issuer.example.com jwksUri: https://issuer.example.com/.well-known/jwks.json # not an inline "jwks:" copy