Een JWKS inspecteren en publieke sleutels in PEM extraheren

inspecteert een JWK Set (JSON Web Key Set) en haalt elke publieke sleutel op in PEM-formaat, klaar om JWT-handtekeningen van een identity provider te verifiëren (OIDC, Auth0, Keycloak…)
Plak de volledige inhoud van een JWKS-document, bijvoorbeeld dat van /.well-known/jwks.json.

Wat is een JWKS?

Een JWKS (JSON Web Key Set, RFC 7517) is een JSON-document dat een lijst van publieke sleutels in gestructureerde vorm groepeert. Het dient om de sleutels te publiceren die een JWT-uitgever gebruikt om zijn tokens te ondertekenen, zodat elke consument ze kan ophalen en de handtekening van de tokens die hij ontvangt kan verifiëren. Het formaat ziet er altijd zo uit:

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

Elke entry van de array keys is een JWK (JSON Web Key) die een publieke sleutel beschrijft: sleuteltype (kty), identifier (kid), beoogd gebruik (use), doelalgoritme (alg) en cryptografische componenten.

Wanneer dient een JWKS?

JWKS is de ruggengraat van moderne OAuth2- en OpenID Connect-architecturen. U zult het in verschillende contexten tegenkomen:

  • OIDC-discovery: elke OpenID Connect-provider exposeert een configuratiedocument op /.well-known/openid-configuration dat een jwks_uri-veld bevat. Op deze URL bevindt zich een JWKS met de actieve publieke sleutels.
  • JWT-verificatie: wanneer uw API een token ontvangt dat is ondertekend in RS256 of ES256, leest het de kid van de header, downloadt het de JWKS van de uitgever, vindt de overeenkomstige sleutel, leidt daaruit de publieke sleutel in PEM-formaat af, en verifieert de handtekening.
  • Sleutelrotatie: een uitgever kan meerdere sleutels gelijktijdig publiceren, wat het mogelijk maakt om een nieuwe sleutel in te voeren voor het ondertekenen van nieuwe tokens terwijl de oude in dienst blijft gedurende de tijd dat de circulerende tokens vervallen.
  • Federaties: SAML, SCIM, onderling verbonden services, de publicatie van een JWKS vermijdt het handmatig uitwisselen van X.509-certificaten tussen partners.

Essentiële velden van een JWK

Enkele velden komen systematisch terug in een JWK. Deze tool extraheert ze en toont ze voor elke sleutel van de geanalyseerde JWKS:

  • kid (key ID): unieke identifier van de sleutel. Het is deze waarde die de header van een JWT plaatst in zijn kid-veld om aan te geven welke sleutel van de JWKS moet dienen voor de verificatie.
  • kty (key type): cryptografische familie. De twee dominante waarden zijn RSA (klassieke RSA-sleutels, gebruikt met RS256, RS384, RS512) en EC (elliptische krommen, gebruikt met ES256, ES384, ES512).
  • alg (algorithm): handtekeningsalgoritme waarvoor deze sleutel is bedoeld. Optioneel veld maar vaak ingevuld. Maakt het mogelijk om snel sleutels te filteren die bruikbaar zijn voor een gegeven JWT.
  • use: gebruik van de sleutel. sig voor handtekening (gebruikelijk geval), enc voor versleuteling (zeldzaam, gebruikt met JWE).

Waarom een JWK naar PEM converteren?

De meeste klassieke cryptografische bibliotheken (OpenSSL, openssl_verify in PHP, crypto in Node.js, JCA in Java) accepteren publieke sleutels in PEM-formaat (Base64 ingekaderd door -----BEGIN PUBLIC KEY-----), niet direct in JWK-formaat. Een JWK naar PEM converteren is dus onmisbaar om:

  • Handmatig de handtekening van een JWT te verifiëren vanuit een script of een opdrachtregeltool (jwt, jose, step crypto).
  • De sleutel te importeren in een debug-tool zoals JWT Verifier die een PEM-sleutel verwacht in zijn "publieke sleutel"-veld.
  • Een sleutel op te slaan in lokale cache of een configuratiebestand in een universele en leesbare vorm.
  • Snel twee sleutels te vergelijken (het PEM-formaat vergemakkelijkt visuele diffs).

Beperkingen en waarschuwingen

Deze tool ondersteunt publieke sleutels RSA (kty=RSA) en EC (kty=EC op de krommen P-256, P-384, P-521). De andere typen (OKP voor Ed25519, oct voor symmetrische sleutels) worden niet geconverteerd: ze worden gesignaleerd met een foutmelding per entry, de rest van de JWKS blijft leesbaar.

  • De conversie gebeurt in één richting: JWKS naar PEM. De reconstructie van een JWK uit een bestaande PEM-sleutel valt niet onder deze versie.
  • De JWKS moet zo geplakt worden als JSON-tekst. Automatisch ophalen vanuit een jwks_uri-URL of een OIDC-endpoint wordt niet aan de serverkant gedaan, om onverwachte uitgaande oproepen te voorkomen.
  • Privésleutels zouden niet moeten verschijnen in een publieke JWKS, en deze tool extraheert alleen de publieke componenten, zelfs als een privésleutel aanwezig zou zijn.

Hoe u het gebruikt

  1. Haal de JWKS op van de uitgever die u wilt inspecteren. Voor een OIDC-provider, is het adres meestal https://voorbeeld.com/.well-known/jwks.json of https://voorbeeld.com/oauth2/jwks.
  2. Kopieer het volledige JSON-document (het object met de keys-sleutel).
  3. Plak het in het invoergebied van de tool en start de analyse.
  4. Voor elke sleutel van de JWKS toont de tool zijn kid, zijn kty, zijn alg, zijn use en de naar PEM-formaat geconverteerde publieke sleutel.
  5. Klik op "kopiëren" om de PEM terug te halen en deze te gebruiken in een verificatiescript, in onze JWT Verifier, of in elke OpenSSL-compatibele tool.

Veelgestelde vragen

Waar vind ik de JWKS van een OIDC-provider?

De overgrote meerderheid van OpenID Connect-providers publiceren een discovery-document op https://voorbeeld.com/.well-known/openid-configuration. Deze JSON bevat een jwks_uri-veld dat naar de daadwerkelijke JWKS verwijst. Enkele providers serveren de JWKS direct op https://voorbeeld.com/.well-known/jwks.json of op een speciale OAuth2-endpoint. Download de inhoud en plak deze hier als zodanig.

Waarom is de kid belangrijk?

De kid (key ID) is de identifier die de header van een JWT plaatst in zijn eigen kid-veld om aan te geven welke sleutel van de JWKS moet dienen voor de verificatie. Zonder deze identifier zou de consument elke sleutel van de JWKS moeten proberen, wat de diagnose bij fouten compliceert. De aanwezigheid van een kid per sleutel wordt dus beschouwd als een goede praktijk, en alle serieuze IdP's publiceren er een.

Wat is het verschil tussen kty=RSA en kty=EC?

RSA is de historische familie van asymmetrische handtekeningen, gebruikt met RS256, RS384, RS512. De sleutels worden beschreven door een modulus n en een exponent e. EC (Elliptic Curve) is recenter en geeft kortere handtekeningen voor een equivalent beveiligingsniveau. EC-sleutels worden beschreven door een kromme (crv = P-256, P-384 of P-521) en twee coördinaten x en y. Deze tool converteert beide families naar PEM.

Hoe gebruik ik de geëxtraheerde PEM om een JWT te verifiëren?

Kopieer de PEM en plak deze vervolgens in het "publieke sleutel"-veld van onze JWT Verifier met de te valideren JWT. U kunt deze ook gebruiken vanaf de opdrachtregel met openssl dgst, vanuit Node.js met crypto.verify, vanuit Python met cryptography of PyJWT, vanuit Java met JCA, enz. Het PEM-formaat wordt universeel herkend.

Mijn JWKS bevat een Ed25519-sleutel (OKP), waarom wordt deze niet geconverteerd?

De conversie van OKP-sleutels (Ed25519, Ed448, X25519, X448) vereist specifieke logica en een andere DER-codering dan die van RSA- en EC-sleutels. Deze versie van de tool ondersteunt alleen RSA en EC. De niet-beheerde sleutels worden individueel gesignaleerd met een foutmelding, zonder de analyse van de andere JWKS-entries te blokkeren.

Kan ik de JWKS vanuit een URL ophalen in plaats van deze te plakken?

Niet in deze versie. De tool voert geen uitgaande HTTP-oproep uit om snel te blijven en te vermijden als onbedoelde proxy te fungeren. Download de JWKS vanuit uw browser of met curl https://voorbeeld.com/.well-known/jwks.json en plak vervolgens de inhoud in het invoerveld.

Voorbeeldverzoek

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

Invoerschema

Veld Type Vereist Standaard
jwks text

Endpoints

  • GET https://cdrn.fr/api/v1/tools - toont alle beschikbare tools
  • GET https://cdrn.fr/api/v1/tools/jwks-inspector - geeft het schema van deze tool terug
  • POST https://cdrn.fr/api/v1/tools/jwks-inspector/execute - voert deze tool uit met een JSON-payload