Inspeccionar un JWKS y extraer las claves públicas en PEM

inspecciona un JWK Set (JSON Web Key Set) y extrae cada clave pública en formato PEM, lista para verificar las firmas JWT de un proveedor de identidad (OIDC, Auth0, Keycloak…)
Pega el contenido completo de un documento JWKS, por ejemplo el publicado en /.well-known/jwks.json.

¿Qué es un JWKS?

Un JWKS (JSON Web Key Set, RFC 7517) es un documento JSON que agrupa una lista de claves públicas en forma estructurada. Sirve para publicar las claves que un emisor de JWT utiliza para firmar sus tokens, de modo que cualquier consumidor pueda recuperarlas y verificar la firma de los tokens que recibe. El formato siempre se presenta así:

{
  "keys": [
    { "kty": "RSA", "kid": "abc123", "use": "sig", "alg": "RS256", "n": "...", "e": "AQAB" },
    { "kty": "EC",  "kid": "def456", "use": "sig", "alg": "ES256", "crv": "P-256", "x": "...", "y": "..." }
  ]
}

Cada entrada de la tabla keys es una JWK (JSON Web Key) que describe una clave pública: tipo de clave (kty), identificador (kid), uso previsto (use), algoritmo objetivo (alg) y componentes criptográficos.

¿Cuándo sirve un JWKS?

El JWKS es la columna vertebral de las arquitecturas OAuth2 y OpenID Connect modernas. Se lo encontrará en varios contextos:

  • Descubrimiento OIDC: todo proveedor OpenID Connect expone un documento de configuración en /.well-known/openid-configuration que contiene un campo jwks_uri. En esa URL se encuentra un JWKS que lista las claves públicas activas.
  • Verificación de JWT: cuando su API recibe un token firmado en RS256 o ES256, lee el kid del header, descarga el JWKS del emisor, encuentra la clave correspondiente, deriva de ella la clave pública en formato PEM y verifica la firma.
  • Rotación de claves: un emisor puede publicar varias claves simultáneamente, lo que permite introducir una nueva clave para firmar los nuevos tokens mientras se mantiene la antigua en servicio el tiempo que los tokens en circulación expiren.
  • Federaciones: SAML, SCIM, servicios interconectados, la publicación de un JWKS evita tener que intercambiar manualmente certificados X.509 entre partners.

Campos esenciales de una JWK

Algunos campos aparecen sistemáticamente en una JWK. Esta herramienta los extrae y los muestra para cada clave del JWKS analizado:

  • kid (key ID): identificador único de la clave. Es ese valor el que el header de un JWT coloca en su campo kid para indicar qué clave del JWKS debe servir para la verificación.
  • kty (key type): familia criptográfica. Los dos valores dominantes son RSA (claves RSA clásicas, usadas con RS256, RS384, RS512) y EC (curvas elípticas, usadas con ES256, ES384, ES512).
  • alg (algorithm): algoritmo de firma para el cual está prevista esta clave. Campo opcional pero a menudo presente. Permite filtrar rápidamente las claves utilizables para un JWT dado.
  • use: uso de la clave. sig para la firma (caso habitual), enc para el cifrado (raro, usado con JWE).

¿Por qué convertir una JWK a PEM?

La mayoría de las bibliotecas criptográficas clásicas (OpenSSL, openssl_verify en PHP, crypto en Node.js, JCA en Java) aceptan las claves públicas en formato PEM (Base64 encuadrado por -----BEGIN PUBLIC KEY-----), no directamente en formato JWK. Convertir una JWK a PEM es, por tanto, indispensable para:

  • Verificar manualmente la firma de un JWT desde un script o una herramienta de línea de comandos (jwt, jose, step crypto).
  • Importar la clave en una herramienta de depuración como JWT Verifier, que espera una clave PEM en su campo "clave pública".
  • Almacenar una clave en caché local o en un fichero de configuración en una forma universal y legible.
  • Comparar rápidamente dos claves (el formato PEM facilita los diff visuales).

Límites y advertencias

Esta herramienta admite las claves públicas RSA (kty=RSA) y EC (kty=EC en las curvas P-256, P-384, P-521). Los demás tipos (OKP para Ed25519, oct para las claves simétricas) no se convierten: se señalan con un mensaje de error por entrada, el resto del JWKS sigue siendo legible.

  • La conversión se realiza en una única dirección: JWKS a PEM. La reconstrucción de una JWK a partir de una clave PEM existente no se cubre en esta versión.
  • El JWKS debe pegarse tal cual como texto JSON. La recuperación automática desde una URL jwks_uri o un endpoint OIDC no se realiza en el lado del servidor, para evitar llamadas salientes imprevistas.
  • Las claves privadas no deberían aparecer en un JWKS público, y esta herramienta solo extrae los componentes públicos aunque haya una clave privada presente.

Cómo utilizarlo

  1. Recupere el JWKS del emisor que quiera inspeccionar. Para un proveedor OIDC, la dirección suele ser https://exemple.com/.well-known/jwks.json o https://exemple.com/oauth2/jwks.
  2. Copie el documento JSON completo (el objeto que contiene la clave keys).
  3. Péguelo en la zona de entrada de la herramienta e inicie el análisis.
  4. Para cada clave del JWKS, la herramienta muestra su kid, su kty, su alg, su use y la clave pública convertida en formato PEM.
  5. Haga clic en "copiar" para recuperar la PEM y utilizarla en un script de verificación, en nuestro JWT Verifier o en cualquier herramienta compatible con OpenSSL.

Preguntas frecuentes

¿Dónde encontrar el JWKS de un proveedor OIDC?

La gran mayoría de los proveedores OpenID Connect publican un documento de descubrimiento en https://exemple.com/.well-known/openid-configuration. Ese JSON contiene un campo jwks_uri que apunta al JWKS efectivo. Algunos proveedores sirven directamente el JWKS en https://exemple.com/.well-known/jwks.json o en un endpoint OAuth2 dedicado. Descargue el contenido y péguelo aquí tal cual.

¿Por qué es importante el kid?

El kid (key ID) es el identificador que el header de un JWT coloca en su propio campo kid para indicar qué clave del JWKS debe servir para la verificación. Sin ese identificador, el consumidor debería probar cada clave del JWKS, lo que complica el diagnóstico en caso de error. La presencia de un kid por clave se considera, por tanto, una buena práctica, y todos los IdP serios publican uno.

¿Cuál es la diferencia entre kty=RSA y kty=EC?

RSA es la familia histórica de firmas asimétricas, utilizada con RS256, RS384, RS512. Las claves se describen mediante un módulo n y un exponente e. EC (Elliptic Curve) es más reciente y produce firmas más cortas para un nivel de seguridad equivalente. Las claves EC se describen mediante una curva (crv = P-256, P-384 o P-521) y dos coordenadas x e y. Esta herramienta convierte las dos familias a PEM.

¿Cómo utilizar la PEM extraída para verificar un JWT?

Copie la PEM y, después, péguela en el campo "clave pública" de nuestro JWT Verifier junto con el JWT que validar. También puede utilizarla desde la línea de comandos con openssl dgst, desde Node.js con crypto.verify, desde Python con cryptography o PyJWT, desde Java con la JCA, etc. El formato PEM es universalmente reconocido.

Mi JWKS contiene una clave Ed25519 (OKP), ¿por qué no se convierte?

La conversión de las claves OKP (Ed25519, Ed448, X25519, X448) requiere una lógica específica y una codificación DER distinta de la de las claves RSA y EC. Esta versión de la herramienta solo admite RSA y EC. Las claves no gestionadas se señalan individualmente con un mensaje de error, sin bloquear el análisis de las demás entradas del JWKS.

¿Se puede recuperar el JWKS desde una URL en lugar de pegarlo?

No en esta versión. La herramienta no realiza ninguna llamada HTTP saliente para mantenerse rápida y evitar actuar como un proxy involuntario. Descargue el JWKS desde su navegador o con curl https://exemple.com/.well-known/jwks.json y, después, pegue el contenido en el campo de entrada.

Ejemplo de solicitud

curl -X POST https://cdrn.fr/api/v1/tools/jwks-inspector/execute \
  -H "Content-Type: application/json" \
  -d '{"jwks":"..."}'

Esquema de entrada

Campo Tipo Obligatorio Por defecto
jwks text

Puntos de acceso

  • GET https://cdrn.fr/api/v1/tools - lista todas las herramientas disponibles
  • GET https://cdrn.fr/api/v1/tools/jwks-inspector - recupera el esquema de esta herramienta
  • POST https://cdrn.fr/api/v1/tools/jwks-inspector/execute - ejecuta esta herramienta con un payload JSON