Ein JWKS inspizieren und öffentliche Schlüssel als PEM extrahieren

inspiziert ein JWK Set (JSON Web Key Set) und extrahiert jeden öffentlichen Schlüssel im PEM-Format, bereit zur Überprüfung der JWT-Signaturen eines Identity Providers (OIDC, Auth0, Keycloak…)
Fügen Sie den vollständigen Inhalt eines JWKS-Dokuments ein, zum Beispiel das unter /.well-known/jwks.json veröffentlichte.

Was ist ein JWKS?

Ein JWKS (JSON Web Key Set, RFC 7517) ist ein JSON-Dokument, das eine Liste öffentlicher Schlüssel in strukturierter Form gruppiert. Es dient dazu, die Schlüssel zu veröffentlichen, die ein JWT-Aussteller zum Signieren seiner Tokens verwendet, damit jeder Konsument sie abrufen und die Signatur der empfangenen Tokens überprüfen kann. Das Format sieht stets so aus:

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

Jeder Eintrag des keys-Arrays ist ein JWK (JSON Web Key), der einen öffentlichen Schlüssel beschreibt: Schlüsseltyp (kty), Bezeichner (kid), vorgesehene Verwendung (use), Zielalgorithmus (alg) und kryptografische Komponenten.

Wann wird ein JWKS verwendet?

JWKS ist das Rückgrat moderner OAuth2- und OpenID-Connect-Architekturen. Sie begegnen ihm in mehreren Kontexten:

  • OIDC-Discovery: Jeder OpenID-Connect-Anbieter stellt ein Konfigurationsdokument unter /.well-known/openid-configuration bereit, das ein Feld jwks_uri enthält. Unter dieser URL findet sich ein JWKS, das die aktiven öffentlichen Schlüssel auflistet.
  • JWT-Überprüfung: Wenn Ihre API ein in RS256 oder ES256 signiertes Token empfängt, liest sie das kid aus dem Header, lädt das JWKS des Ausstellers herunter, findet den entsprechenden Schlüssel, leitet daraus den öffentlichen Schlüssel im PEM-Format ab und überprüft die Signatur.
  • Schlüsselrotation: Ein Aussteller kann mehrere Schlüssel gleichzeitig veröffentlichen, was es ermöglicht, einen neuen Schlüssel zum Signieren neuer Tokens einzuführen, während der alte im Dienst bleibt, bis die im Umlauf befindlichen Tokens ablaufen.
  • Föderationen: SAML, SCIM, miteinander verbundene Dienste, die Veröffentlichung eines JWKS erspart den manuellen Austausch von X.509-Zertifikaten zwischen Partnern.

Wesentliche Felder eines JWK

Einige Felder erscheinen systematisch in einem JWK. Dieses Tool extrahiert sie und zeigt sie für jeden Schlüssel des analysierten JWKS an:

  • kid (key ID): eindeutiger Bezeichner des Schlüssels. Das ist der Wert, den der Header eines JWT in sein kid-Feld setzt, um anzugeben, welcher Schlüssel des JWKS zur Überprüfung verwendet werden soll.
  • kty (key type): kryptografische Familie. Die beiden dominanten Werte sind RSA (klassische RSA-Schlüssel, verwendet mit RS256, RS384, RS512) und EC (elliptische Kurven, verwendet mit ES256, ES384, ES512).
  • alg (algorithm): Signaturalgorithmus, für den dieser Schlüssel vorgesehen ist. Optionales, aber häufig ausgefülltes Feld. Erlaubt das schnelle Filtern der für ein bestimmtes JWT verwendbaren Schlüssel.
  • use: Verwendung des Schlüssels. sig für die Signatur (üblicher Fall), enc für die Verschlüsselung (selten, mit JWE verwendet).

Warum einen JWK in PEM konvertieren?

Die meisten klassischen kryptografischen Bibliotheken (OpenSSL, openssl_verify in PHP, crypto in Node.js, JCA in Java) akzeptieren öffentliche Schlüssel im PEM-Format (Base64 eingerahmt von -----BEGIN PUBLIC KEY-----), nicht direkt im JWK-Format. Die Konvertierung eines JWK in PEM ist daher unverzichtbar für:

  • die manuelle Überprüfung einer JWT-Signatur aus einem Skript oder einem Kommandozeilen-Tool (jwt, jose, step crypto).
  • das Importieren des Schlüssels in ein Debug-Tool wie JWT Verifier, das in seinem "Öffentlicher-Schlüssel"-Feld einen PEM-Schlüssel erwartet.
  • das Speichern eines Schlüssels im lokalen Cache oder in einer Konfigurationsdatei in einer universellen und lesbaren Form.
  • den schnellen Vergleich zweier Schlüssel (das PEM-Format erleichtert visuelle Diffs).

Grenzen und Warnungen

Dieses Tool unterstützt öffentliche Schlüssel RSA (kty=RSA) und EC (kty=EC auf den Kurven P-256, P-384, P-521). Andere Typen (OKP für Ed25519, oct für symmetrische Schlüssel) werden nicht konvertiert: Sie werden mit einer Fehlermeldung pro Eintrag signalisiert, der Rest des JWKS bleibt lesbar.

  • Die Konvertierung erfolgt nur in eine Richtung: JWKS zu PEM. Die Rekonstruktion eines JWK aus einem bestehenden PEM-Schlüssel wird von dieser Version nicht abgedeckt.
  • Das JWKS muss unverändert als JSON-Text eingefügt werden. Der automatische Abruf von einer jwks_uri-URL oder einem OIDC-Endpoint erfolgt nicht serverseitig, um unvorhergesehene ausgehende Aufrufe zu vermeiden.
  • Private Schlüssel sollten nicht in einem öffentlichen JWKS erscheinen, und dieses Tool extrahiert auch dann nur die öffentlichen Komponenten, wenn ein privater Schlüssel vorhanden wäre.

So verwenden Sie es

  1. Holen Sie sich das JWKS des Ausstellers, den Sie inspizieren möchten. Für einen OIDC-Anbieter lautet die Adresse in der Regel https://exemple.com/.well-known/jwks.json oder https://exemple.com/oauth2/jwks.
  2. Kopieren Sie das gesamte JSON-Dokument (das Objekt, das den Schlüssel keys enthält).
  3. Fügen Sie es in das Eingabefeld des Tools ein und starten Sie die Analyse.
  4. Für jeden Schlüssel des JWKS zeigt das Tool sein kid, sein kty, sein alg, sein use und den ins PEM-Format konvertierten öffentlichen Schlüssel an.
  5. Klicken Sie auf "kopieren", um die PEM abzurufen und sie in einem Verifizierungsskript, in unserem JWT Verifier oder in jedem OpenSSL-kompatiblen Tool zu verwenden.

Häufig gestellte Fragen

Wo findet man das JWKS eines OIDC-Anbieters?

Die meisten OpenID-Connect-Anbieter veröffentlichen ein Discovery-Dokument unter https://exemple.com/.well-known/openid-configuration. Dieses JSON enthält ein Feld jwks_uri, das auf das tatsächliche JWKS verweist. Einige Anbieter stellen das JWKS direkt unter https://exemple.com/.well-known/jwks.json oder unter einem dedizierten OAuth2-Endpoint bereit. Laden Sie den Inhalt herunter und fügen Sie ihn hier unverändert ein.

Warum ist die kid wichtig?

Die kid (key ID) ist der Bezeichner, den der Header eines JWT in sein eigenes kid-Feld setzt, um anzugeben, welcher Schlüssel des JWKS zur Überprüfung verwendet werden soll. Ohne diesen Bezeichner müsste der Konsument jeden Schlüssel des JWKS ausprobieren, was die Diagnose im Fehlerfall erschwert. Das Vorhandensein einer kid pro Schlüssel gilt daher als Best Practice, und alle ernsthaften IdPs veröffentlichen eine.

Was ist der Unterschied zwischen kty=RSA und kty=EC?

RSA ist die historische Familie asymmetrischer Signaturen, verwendet mit RS256, RS384, RS512. Die Schlüssel werden durch ein Modulo n und einen Exponenten e beschrieben. EC (Elliptic Curve) ist neuer und liefert bei gleichem Sicherheitsniveau kürzere Signaturen. EC-Schlüssel werden durch eine Kurve (crv = P-256, P-384 oder P-521) und zwei Koordinaten x und y beschrieben. Dieses Tool konvertiert beide Familien in PEM.

Wie verwendet man die extrahierte PEM, um ein JWT zu überprüfen?

Kopieren Sie die PEM und fügen Sie sie dann in das Feld "Öffentlicher Schlüssel" unseres JWT Verifier zusammen mit dem zu validierenden JWT ein. Sie können sie auch von der Kommandozeile mit openssl dgst verwenden, von Node.js mit crypto.verify, von Python mit cryptography oder PyJWT, von Java mit der JCA usw. Das PEM-Format wird universell anerkannt.

Mein JWKS enthält einen Ed25519-Schlüssel (OKP), warum wird er nicht konvertiert?

Die Konvertierung von OKP-Schlüsseln (Ed25519, Ed448, X25519, X448) erfordert eine spezifische Logik und eine andere DER-Kodierung als die von RSA- und EC-Schlüsseln. Diese Version des Tools unterstützt nur RSA und EC. Nicht unterstützte Schlüssel werden einzeln mit einer Fehlermeldung signalisiert, ohne die Analyse der übrigen JWKS-Einträge zu blockieren.

Kann man das JWKS von einer URL holen, statt es einzufügen?

In dieser Version nicht. Das Tool führt keinen ausgehenden HTTP-Aufruf durch, um schnell zu bleiben und zu vermeiden, dass es als unfreiwilliger Proxy agiert. Laden Sie das JWKS aus Ihrem Browser oder mit curl https://exemple.com/.well-known/jwks.json herunter und fügen Sie den Inhalt dann in das Eingabefeld ein.

Beispielanfrage

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

Eingabeschema

Feld Typ Erforderlich Standard
jwks text

Endpunkte

  • GET https://cdrn.fr/api/v1/tools - listet alle verfügbaren Tools auf
  • GET https://cdrn.fr/api/v1/tools/jwks-inspector - liefert das Schema dieses Tools
  • POST https://cdrn.fr/api/v1/tools/jwks-inspector/execute - führt dieses Tool mit einem JSON-Payload aus