Aller au contenu
ecdsa.com
Envoy / IstioJWKS et découverte des clés

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

Comment corriger l’erreur

  1. 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. 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

Erreurs associées

Parcourir toute la base de données des erreurs de signature