Pular para o conteúdo
ecdsa.com
Envoy / IstioJWKS e descoberta de chaves

Mensagem de erro

Jwks doesn't have key to match kid or alg from Jwt

Também aparece como

  • Jwt verification fails
  • Jwks remote fetch is failed

Corpo da resposta 401; o cabeçalho `WWW-Authenticate` traz `error="invalid_token"`. Um provedor cujo `remote_jwks` não pode ser obtido responde “Jwks remote fetch is failed”.

Envoy / Istio — envoy.filters.http.jwt_authn (401 response body; Istio RequestAuthentication)

O que significa

O filtro `jwt_authn` do Envoy (usado também pelo `RequestAuthentication` do Istio) procurou no JWKS do provedor uma chave com o `kid` do token e de um tipo compatível com o `alg` dele, não encontrou nenhuma e por isso respondeu 401 com este texto no corpo. A assinatura nem chegou a ser verificada. Se houver uma chave correspondente, mas a verificação da assinatura falhar, o corpo passa a ser “Jwt verification fails”.

Por que acontece

Como corrigir

  1. 1.

    Buscar o JWKS no emissor

    Use `remote_jwks` com um `cache_duration` razoável e busca assíncrona, para que as chaves já estejam disponíveis antes que os tokens as usem.

    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.

    No Istio, apontar para o jwksUri

    O Istiod busca e distribui as chaves; um valor `jwks` embutido precisa ser atualizado à mão a cada rotação.

    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

Erros relacionados

Ver toda a base de erros de assinatura