Mensaje de error
Jwks doesn't have key to match kid or alg from Jwt
También se muestra como
- Jwt verification fails
- Jwks remote fetch is failed
Cuerpo de la respuesta 401; el encabezado `WWW-Authenticate` lleva `error="invalid_token"`. Un proveedor cuyo `remote_jwks` no se puede obtener responde «Jwks remote fetch is failed».
Envoy / Istio — envoy.filters.http.jwt_authn (401 response body; Istio RequestAuthentication)
Qué significa
El filtro `jwt_authn` de Envoy (en el que también se basa `RequestAuthentication` de Istio) buscó en el JWKS del proveedor una clave con el `kid` del token y un tipo compatible con su `alg`, no encontró ninguna y respondió 401 con este texto como cuerpo. La firma no llegó a comprobarse. Si existe una clave que coincide pero la firma no se verifica, el cuerpo es «Jwt verification fails».
Por qué ocurre
La caché de Envoy es anterior a la rotación de claves del emisor
frecuente`remote_jwks` se guarda en caché durante `cache_duration` (5 minutos de forma predeterminada). Los tokens firmados con una clave publicada después de la última descarga fallan hasta que se actualiza la caché.
Una copia local o incrustada del JWKS
frecuente`local_jwks` (o el `jwks:` incrustado de Istio) es una instantánea. Nunca se entera de las claves nuevas; cada rotación rompe la autenticación hasta que se actualiza la configuración.
La clave con este kid es de otro tipo
ocasionalEl JWKS contiene el `kid`, pero como clave RSA, mientras que el token es ES256 (o el `alg` de la JWK no coincide). Envoy exige que ambos coincidan.
El token pertenece a otro emisor
ocasionalUn proveedor sin una coincidencia estricta de `issuer`, o una solicitud que lleva un token de otro proveedor de identidad, se comprueba con el conjunto de claves equivocado.
Cómo solucionarlo
- 1.
Obtener el JWKS del emisor
Usa `remote_jwks` con un `cache_duration` razonable y la descarga asíncrona activada, para que las claves ya estén disponibles cuando los tokens las usen.
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.
En Istio, apuntar a jwksUri
Istiod obtiene y distribuye las claves; un valor `jwks` incrustado debe actualizarse a mano en cada rotación.
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