Inspectarea unui JWKS și extragerea cheilor publice PEM

inspectează un JWK Set (JSON Web Key Set) și extrage fiecare cheie publică în format PEM, gata de utilizat pentru verificarea semnăturilor JWT ale unui furnizor de identitate (OIDC, Auth0, Keycloak…)
Lipiți conținutul complet al unui document JWKS, de exemplu cel expus pe /.well-known/jwks.json.

Ce este un JWKS?

Un JWKS (JSON Web Key Set, RFC 7517) este un document JSON care grupează o listă de chei publice sub formă structurată. Servește la publicarea cheilor pe care un emitent de JWT le utilizează pentru a-și semna token-urile, astfel încât orice consumator să le poată recupera și verifica semnătura token-urilor pe care le primește. Formatul se prezintă întotdeauna astfel:

{
  "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": "..." }
  ]
}

Fiecare intrare a tabloului keys este o JWK (JSON Web Key) care descrie o cheie publică: tip de cheie (kty), identificator (kid), utilizare prevăzută (use), algoritm țintă (alg) și componente criptografice.

Când servește un JWKS?

JWKS-ul este coloana vertebrală a arhitecturilor OAuth2 și OpenID Connect moderne. Îl vei întâlni în mai multe contexte:

  • Descoperire OIDC: orice furnizor OpenID Connect expune un document de configurare la /.well-known/openid-configuration care conține un câmp jwks_uri. La acest URL se găsește un JWKS listând cheile publice active.
  • Verificare a JWT: când API-ul tău primește un token semnat în RS256 sau ES256, citește kid-ul header-ului, descarcă JWKS-ul emitentului, găsește cheia corespunzătoare, derivă cheia publică în format PEM, și verifică semnătura.
  • Rotație de chei: un emitent poate publica mai multe chei simultan, ceea ce permite introducerea unei noi chei pentru a semna noile token-uri păstrând totodată vechea cheie în serviciu cât timp expiră token-urile în circulație.
  • Federations: SAML, SCIM, servicii interconectate, publicarea unui JWKS evită schimbul manual de certificate X.509 între parteneri.

Câmpuri esențiale ale unei JWK

Câteva câmpuri revin sistematic într-o JWK. Acest instrument le extrage și le afișează pentru fiecare cheie a JWKS-ului analizat:

  • kid (key ID): identificator unic al cheii. Această valoare este cea pe care header-ul unui JWT o pune în câmpul său kid pentru a indica care cheie a JWKS-ului trebuie să servească la verificare.
  • kty (key type): familie criptografică. Cele două valori dominante sunt RSA (chei RSA clasice, utilizate cu RS256, RS384, RS512) și EC (curbe eliptice, utilizate cu ES256, ES384, ES512).
  • alg (algorithm): algoritm de semnătură pentru care această cheie este prevăzută. Câmp facultativ dar adesea completat. Permite filtrarea rapidă a cheilor utilizabile pentru un JWT dat.
  • use: utilizarea cheii. sig pentru semnătură (caz uzual), enc pentru criptare (rar, utilizat cu JWE).

De ce să convertești o JWK în PEM?

Majoritatea bibliotecilor criptografice clasice (OpenSSL, openssl_verify în PHP, crypto în Node.js, JCA în Java) acceptă cheile publice în format PEM (Base64 încadrat de -----BEGIN PUBLIC KEY-----), nu direct în format JWK. Conversia unei JWK în PEM este deci indispensabilă pentru:

  • A verifica manual semnătura unui JWT dintr-un script sau instrument în linie de comandă (jwt, jose, step crypto).
  • A importa cheia într-un instrument de debug precum JWT Verifier care așteaptă o cheie PEM în câmpul său "cheie publică".
  • A stoca o cheie în cache local sau într-un fișier de configurare sub o formă universală și lizibilă.
  • A compara rapid două chei (formatul PEM facilitează diff-urile vizuale).

Limite și avertismente

Acest instrument ia în considerare cheile publice RSA (kty=RSA) și EC (kty=EC pe curbele P-256, P-384, P-521). Celelalte tipuri (OKP pentru Ed25519, oct pentru cheile simetrice) nu sunt convertite: sunt semnalate cu un mesaj de eroare per intrare, restul JWKS-ului rămâne lizibil.

  • Conversia se efectuează într-o singură direcție: JWKS spre PEM. Reconstrucția unei JWK dintr-o cheie PEM existentă nu este acoperită de această versiune.
  • JWKS-ul trebuie să fie lipit ca atare sub formă de text JSON. Recuperarea automată dintr-un URL jwks_uri sau dintr-un endpoint OIDC nu se face pe partea serverului, pentru a evita apelurile ieșite imprevizibile.
  • Cheile private nu trebuie să apară într-un JWKS public, iar acest instrument extrage doar componentele publice chiar dacă o cheie privată ar fi prezentă.

Cum să-l utilizezi

  1. Recuperează JWKS-ul emitentului pe care vrei să-l inspectezi. Pentru un furnizor OIDC, adresa este în general https://exemplu.com/.well-known/jwks.json sau https://exemplu.com/oauth2/jwks.
  2. Copiază integralitatea documentului JSON (obiectul conținând cheia keys).
  3. Lipește-l în zona de intrare a instrumentului și lansează analiza.
  4. Pentru fiecare cheie a JWKS-ului, instrumentul afișează kid-ul său, kty-ul său, alg-ul său, use-ul său și cheia publică convertită în format PEM.
  5. Apasă pe "copiere" pentru a recupera PEM-ul și a-l utiliza într-un script de verificare, în JWT Verifier-ul nostru, sau în orice instrument compatibil OpenSSL.

Întrebări frecvente

Unde să găsesc JWKS-ul unui furnizor OIDC?

Marea majoritate a furnizorilor OpenID Connect publică un document de descoperire pe https://exemplu.com/.well-known/openid-configuration. Acest JSON conține un câmp jwks_uri care indică spre JWKS-ul efectiv. Câțiva furnizori servesc direct JWKS-ul pe https://exemplu.com/.well-known/jwks.json sau pe un endpoint OAuth2 dedicat. Descarcă conținutul și lipește-l aici ca atare.

De ce este kid-ul important?

kid-ul (key ID) este identificatorul pe care header-ul unui JWT îl pune în propriul său câmp kid pentru a indica care cheie a JWKS-ului trebuie să servească la verificare. Fără acest identificator, consumatorul ar trebui să încerce fiecare cheie a JWKS-ului, ceea ce complică diagnosticul în caz de eroare. Prezența unui kid per cheie este deci considerată ca o bună practică, și toți IdP serioși publică unul.

Care este diferența între kty=RSA și kty=EC?

RSA este familia istorică de semnături asimetrice, utilizată cu RS256, RS384, RS512. Cheile sunt descrise printr-un modulo n și un exponent e. EC (Elliptic Curve) este mai recent și dă semnături mai scurte pentru un nivel de securitate echivalent. Cheile EC sunt descrise printr-o curbă (crv = P-256, P-384 sau P-521) și două coordonate x și y. Acest instrument convertește ambele familii în PEM.

Cum să utilizezi PEM-ul extras pentru a verifica un JWT?

Copiază PEM-ul, apoi lipește-l în câmpul "cheie publică" al JWT Verifier-ului nostru cu JWT-ul de validat. Îl poți utiliza de asemenea din linia de comandă cu openssl dgst, din Node.js cu crypto.verify, din Python cu cryptography sau PyJWT, din Java cu JCA, etc. Formatul PEM este universal recunoscut.

JWKS-ul meu conține o cheie Ed25519 (OKP), de ce nu este convertită?

Conversia cheilor OKP (Ed25519, Ed448, X25519, X448) cere o logică specifică și o codare DER diferită de cea a cheilor RSA și EC. Această versiune a instrumentului ia în considerare doar RSA și EC. Cheile negestionate sunt semnalate individual cu un mesaj de eroare, fără a bloca analiza celorlalte intrări ale JWKS-ului.

Poți recupera JWKS-ul dintr-un URL în loc să-l lipești?

Nu în această versiune. Instrumentul nu realizează niciun apel HTTP ieșit pentru a rămâne rapid și a evita să acționeze ca un proxy involuntar. Descarcă JWKS-ul din browserul tău sau cu curl https://exemplu.com/.well-known/jwks.json apoi lipește conținutul în câmpul de intrare.

Exemplu de cerere

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

Schema de intrare

Câmp Tip Obligatoriu Implicit
jwks text

Puncte de acces

  • GET https://cdrn.fr/api/v1/tools - listează toate instrumentele disponibile
  • GET https://cdrn.fr/api/v1/tools/jwks-inspector - obține schema acestui instrument
  • POST https://cdrn.fr/api/v1/tools/jwks-inspector/execute - execută acest instrument cu un payload JSON