Inspektera ett JWKS och extrahera publika nycklar som PEM

inspekterar en JWK Set (JSON Web Key Set) och extraherar varje publik nyckel i PEM-format, redo att verifiera JWT-signaturer från en identitetsleverantör (OIDC, Auth0, Keycloak…)
Klistra in hela innehållet i ett JWKS-dokument, till exempel det som publiceras på /.well-known/jwks.json.

Vad är ett JWKS?

Ett JWKS (JSON Web Key Set, RFC 7517) är ett JSON-dokument som samlar en lista över publika nycklar i strukturerad form. Det används för att publicera de nycklar som en JWT-utfärdare använder för att signera sina tokens, så att vilken konsument som helst kan hämta dem och verifiera signaturen på de tokens den tar emot. Formatet presenteras alltid så här:

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

Varje element i arrayen keys är en JWK (JSON Web Key) som beskriver en publik nyckel: nyckeltyp (kty), identifierare (kid), avsedd användning (use), målalgoritm (alg) och kryptografiska komponenter.

När används ett JWKS?

JWKS är ryggraden i moderna OAuth2- och OpenID Connect-arkitekturer. Du kommer att stöta på det i flera sammanhang:

  • OIDC-discovery: varje OpenID Connect-leverantör exponerar ett konfigurations- dokument på /.well-known/openid-configuration som innehåller ett jwks_uri-fält. På den URL:en finns ett JWKS som listar de aktiva publika nycklarna.
  • JWT-verifiering: när ditt API tar emot en token signerad i RS256 eller ES256, läser det kid i headern, laddar ner utfärdarens JWKS, hittar motsvarande nyckel, härleder den publika nyckeln i PEM-format och verifierar signaturen.
  • Nyckelrotation: en utfärdare kan publicera flera nycklar samtidigt, vilket gör det möjligt att införa en ny nyckel för att signera nya tokens samtidigt som den gamla behålls i tjänst medan cirkulerande tokens går ut.
  • Federationer: SAML, SCIM, sammankopplade tjänster, publiceringen av ett JWKS slipper man behöva utbyta X.509-certifikat manuellt mellan partners.

Väsentliga fält i en JWK

Vissa fält återkommer systematiskt i en JWK. Det här verktyget extraherar och visar dem för varje nyckel i det analyserade JWKS:et:

  • kid (key ID): nyckelns unika identifierare. Det är det värde som headern på en JWT placerar i sitt kid-fält för att ange vilken nyckel i JWKS:et som ska användas för verifieringen.
  • kty (key type): kryptografisk familj. De två dominerande värdena är RSA (klassiska RSA-nycklar, använda med RS256, RS384, RS512) och EC (elliptiska kurvor, använda med ES256, ES384, ES512).
  • alg (algorithm): signaturalgoritm som den här nyckeln är avsedd för. Frivilligt fält men ofta angivet. Tillåter snabb filtrering av nycklar som kan användas för en given JWT.
  • use: nyckelns användning. sig för signatur (vanligt fall), enc för kryptering (sällsynt, används med JWE).

Varför konvertera en JWK till PEM?

De flesta klassiska kryptografiska bibliotek (OpenSSL, openssl_verify i PHP, crypto i Node.js, JCA i Java) accepterar publika nycklar i PEM-format (Base64 omgärdad av -----BEGIN PUBLIC KEY-----), inte direkt i JWK-format. Att konvertera en JWK till PEM är därför oumbärligt för att:

  • Manuellt verifiera signaturen på en JWT från ett skript eller ett kommandoradsverktyg (jwt, jose, step crypto).
  • Importera nyckeln till ett debugverktyg som JWT Verifier som väntar sig en PEM-nyckel i sitt "publik nyckel"-fält.
  • Lagra en nyckel i lokal cache eller en konfigurationsfil i en universell och läsbar form.
  • Snabbt jämföra två nycklar (PEM-formatet underlättar visuella diffar).

Begränsningar och varningar

Det här verktyget stöder publika nycklar RSA (kty=RSA) och EC (kty=EC på kurvorna P-256, P-384, P-521). Andra typer (OKP för Ed25519, oct för symmetriska nycklar) konverteras inte: de flaggas med ett felmeddelande per post, resten av JWKS:et förblir läsbart.

  • Konverteringen utförs i en enda riktning: JWKS till PEM. Att rekonstruera en JWK från en befintlig PEM-nyckel täcks inte av den här versionen.
  • JWKS:et måste klistras in som det är i form av JSON-text. Automatisk hämtning från en jwks_uri-URL eller en OIDC-endpoint görs inte på serversidan, för att undvika oväntade utgående anrop.
  • Privata nycklar förväntas inte förekomma i ett publikt JWKS, och det här verktyget extraherar bara publika komponenter även om en privat nyckel skulle finnas.

Så använder du det

  1. Hämta JWKS:et för den utfärdare du vill inspektera. För en OIDC-leverantör är adressen oftast https://exemple.com/.well-known/jwks.json eller https://exemple.com/oauth2/jwks.
  2. Kopiera hela JSON-dokumentet (objektet som innehåller nyckeln keys).
  3. Klistra in det i verktygets inmatningsfält och starta analysen.
  4. För varje nyckel i JWKS:et visar verktyget dess kid, kty, alg, use och den publika nyckeln konverterad till PEM-format.
  5. Klicka på "kopiera" för att hämta PEM:en och använda den i ett verifieringsskript, i vår JWT Verifier, eller i något OpenSSL- kompatibelt verktyg.

Vanliga frågor

Var hittar man JWKS för en OIDC-leverantör?

Den absoluta majoriteten av OpenID Connect-leverantörer publicerar ett discovery-dokument på https://exemple.com/.well-known/openid-configuration. Den JSON:en innehåller ett fält jwks_uri som pekar på det faktiska JWKS:et. Vissa leverantörer serverar direkt JWKS:et på https://exemple.com/.well-known/jwks.json eller på en dedikerad OAuth2- endpoint. Ladda ner innehållet och klistra in det här som det är.

Varför är kid viktigt?

kid (key ID) är identifieraren som headern på en JWT placerar i sitt eget kid-fält för att ange vilken nyckel i JWKS:et som ska användas för verifieringen. Utan den identifieraren skulle konsumenten behöva prova varje nyckel i JWKS:et, vilket komplicerar diagnostiken vid fel. Förekomsten av ett kid per nyckel anses därför vara god praxis och alla seriösa IdP:er publicerar ett.

Vad är skillnaden mellan kty=RSA och kty=EC?

RSA är den historiska familjen av asymmetriska signaturer, använd med RS256, RS384, RS512. Nycklarna beskrivs av en modulus n och en exponent e. EC (Elliptic Curve) är nyare och ger kortare signaturer för motsvarande säkerhetsnivå. EC-nycklar beskrivs av en kurva (crv = P-256, P-384 eller P-521) och två koordinater x och y. Det här verktyget konverterar båda familjerna till PEM.

Hur använder man den extraherade PEM:en för att verifiera en JWT?

Kopiera PEM:en och klistra in den i fältet "publik nyckel" i vår JWT Verifier med JWT:en att validera. Du kan också använda den från kommandoraden med openssl dgst, från Node.js med crypto.verify, från Python med cryptography eller PyJWT, från Java med JCA osv. PEM-formatet är universellt erkänt.

Mitt JWKS innehåller en Ed25519-nyckel (OKP), varför konverteras den inte?

Konvertering av OKP-nycklar (Ed25519, Ed448, X25519, X448) kräver specifik logik och en annan DER-kodning än för RSA- och EC-nycklar. Den här versionen av verktyget stöder endast RSA och EC. Nycklar som inte hanteras flaggas individuellt med ett felmeddelande, utan att blockera analysen av de andra posterna i JWKS:et.

Kan man hämta JWKS från en URL i stället för att klistra in det?

Inte i den här versionen. Verktyget gör inga utgående HTTP-anrop för att förbli snabbt och undvika att agera som en ofrivillig proxy. Ladda ner JWKS:et från din webbläsare eller med curl https://exemple.com/.well-known/jwks.json och klistra sedan in innehållet i inmatningsfältet.

Exempelförfrågan

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

Indatasschema

Fält Typ Obligatorisk Standard
jwks text

Slutpunkter

  • GET https://cdrn.fr/api/v1/tools - listar alla tillgängliga verktyg
  • GET https://cdrn.fr/api/v1/tools/jwks-inspector - hämtar schemat för detta verktyg
  • POST https://cdrn.fr/api/v1/tools/jwks-inspector/execute - kör detta verktyg med en JSON-payload