Перейти к содержимому
ecdsa.com
Envoy / IstioJWKS и обнаружение ключей

Сообщение об ошибке

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

Также выводится как

  • Jwt verification fails
  • Jwks remote fetch is failed

Тело ответа 401; заголовок `WWW-Authenticate` содержит `error="invalid_token"`. Провайдер, чей `remote_jwks` не удаётся загрузить, отвечает «Jwks remote fetch is failed».

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

Что это означает

Фильтр `jwt_authn` в Envoy (его использует и `RequestAuthentication` в Istio) искал в JWKS провайдера ключ с `kid` токена и типом, подходящим к его `alg`, не нашёл такого и ответил 401 с этим текстом в теле. До проверки подписи дело не дошло. Если подходящий ключ есть, но подпись не проходит проверку, тело ответа будет другим: «Jwt verification fails».

Почему это происходит

Как исправить

  1. 1.

    Загружайте JWKS у издателя

    Используйте `remote_jwks` с разумным `cache_duration` и асинхронной загрузкой, чтобы ключи были на месте до того, как ими начнут подписывать токены.

    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.

    В Istio укажите jwksUri

    Istiod сам загружает и рассылает ключи; встроенное значение `jwks` нужно обновлять вручную при каждой ротации.

    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

Связанные ошибки

Открыть всю базу ошибок подписей