Επιθεώρηση JWKS και εξαγωγή δημοσίων κλειδιών PEM

επιθεωρεί ένα JWK Set (JSON Web Key Set) και εξάγει κάθε δημόσιο κλειδί σε μορφή PEM, έτοιμο για χρήση για επαλήθευση των υπογραφών JWT από έναν παροχέα ταυτότητας (OIDC, Auth0, Keycloak…)
Επικολλήστε το πλήρες περιεχόμενο ενός εγγράφου JWKS, για παράδειγμα αυτό που εκτίθεται στο /.well-known/jwks.json.

Τι είναι ένα JWKS;

Ένα JWKS (JSON Web Key Set, RFC 7517) είναι ένα έγγραφο JSON που ομαδοποιεί ένα λίστα δημόσιων κλειδιών σε δομημένη μορφή. Χρησιμοποιείται για τη δημοσίευση των κλειδιών που εκδίδει ένας εκδότης JWT χρησιμοποιεί για να υπογράψει τις μάρκες της, ώστε να μπορεί να τις συλλέξει οποιοσδήποτε καταναλωτής και επαληθεύστε την υπογραφή των διακριτικών που λαμβάνει. Η μορφή μοιάζει πάντα με αυτό:

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

Κάθε καταχώρηση στον πίνακα keys είναι ένα JWK (JSON Web Key) το οποίο περιγράφει ένα δημόσιο κλειδί: τύπος κλειδιού (kty), αναγνωριστικό (kid), χρήση προοριζόμενο (χρήση), αλγόριθμος στόχου (alg) και κρυπτογραφικά στοιχεία.

Πότε χρησιμοποιείται ένα JWKS;

Το JWKS είναι η ραχοκοκαλιά των σύγχρονων αρχιτεκτονικών OAuth2 και OpenID Connect. Εσύ θα συναντηθούν σε διάφορα πλαίσια:

  • OIDC Discovery: οποιοσδήποτε πάροχος OpenID Connect εκθέτει ένα έγγραφο του διαμόρφωση στο /.well-known/openid-configuration που περιέχει ένα πεδίο jwks_uri. Σε αυτήν τη διεύθυνση URL υπάρχει ένα JWKS που περιέχει ενεργά δημόσια κλειδιά.
  • Επαλήθευση JWT: όταν το API σας λαμβάνει ένα διακριτικό υπογεγραμμένο σε RS256 ή ES256, διαβάζει το kid της κεφαλίδας, κατεβάζει το JWKS του πομπού, βρίσκει το κλειδί αντίστοιχο, εξάγει το δημόσιο κλειδί σε μορφή PEM και επαληθεύει την υπογραφή.
  • Εναλλαγή κλειδιών: ένας εκδότης μπορεί να δημοσιεύσει πολλά κλειδιά ταυτόχρονα, αυτό το οποίο σας επιτρέπει να εισάγετε ένα νέο κλειδί για να υπογράψετε τα νέα διακριτικά ενώ κρατάτε το παλιό σε υπηρεσία ενώ λήγουν οι μάρκες σε κυκλοφορία.
  • Ομοσπονδίες: SAML, SCIM, διασυνδεδεμένες υπηρεσίες, δημοσίευση ενός JWKS αποφεύγει τη μη αυτόματη ανταλλαγή πιστοποιητικών X.509 μεταξύ συνεργατών.

Βασικά πεδία ενός JWK

Ορισμένα πεδία εμφανίζονται συστηματικά σε ένα JWK. Αυτό το εργαλείο τα εξάγει και τα εμφανίζει για κάθε κλειδί του JWKS που αναλύθηκε:

  • παιδί (αναγνωριστικό κλειδιού): μοναδικό αναγνωριστικό του κλειδιού. Αυτή είναι η τιμή που η κεφαλίδα ενός JWT βάζει στο πεδίο kid για να υποδείξει ποιο κλειδί του JWKS πρέπει να χρησιμοποιηθεί για επαλήθευση.
  • kty (τύπος κλειδιού): κρυπτογραφική οικογένεια. Οι δύο αξίες κυρίαρχα είναι τα RSA (κλασικά κλειδιά RSA, που χρησιμοποιούνται με RS256, RS384, RS512) και EC (ελλειπτικές καμπύλες, που χρησιμοποιούνται με τα ES256, ES384, ES512).
  • alg (αλγόριθμος): αλγόριθμος υπογραφής για τον οποίο αυτό το κλειδί προγραμματίζεται. Προαιρετικό πεδίο αλλά συχνά συμπληρώνεται. Σας επιτρέπει να φιλτράρετε γρήγορα κλειδιά μπορεί να χρησιμοποιηθεί για ένα δεδομένο JWT.
  • χρήση: χρήση του κλειδιού. sig για την υπογραφή (περίπτωση συνήθως), enc για κρυπτογράφηση (σπάνια, χρησιμοποιείται με το JWE).

Γιατί να μετατρέψετε ένα JWK σε PEM;

Η πλειοψηφία των κλασικών βιβλιοθηκών κρυπτογράφησης (OpenSSL, openssl_verify σε PHP, crypto στο Node.js, JCA σε Java) δέχονται δημόσια κλειδιά στη μορφή PEM (Base64 πλαισιωμένο από -----BEGIN PUBLIC KEY-----), όχι απευθείας σε μορφή JWK. Επομένως, η μετατροπή ενός JWK σε PEM είναι απαραίτητη για:

  • Επαληθεύστε με μη αυτόματο τρόπο την υπογραφή ενός JWT από ένα σενάριο ή ένα εργαλείο γραμμής εντολών (jwt, jose, βήμα κρυπτογράφησης).
  • Εισαγάγετε το κλειδί σε ένα εργαλείο εντοπισμού σφαλμάτων όπως το JWT Verifier που αναμένει ένα κλειδί PEM στο πεδίο "δημόσιο κλειδί".
  • Αποθηκεύστε ένα κλειδί σε μια τοπική προσωρινή μνήμη ή σε ένα αρχείο διαμόρφωσης σε καθολική μορφή και ευανάγνωστο.
  • Συγκρίνετε γρήγορα δύο κλειδιά (η μορφή PEM διευκολύνει τις οπτικές διαφορές).

Περιορισμοί και προειδοποιήσεις

Αυτό το εργαλείο υποστηρίζει RSA (kty=RSA) και δημόσια κλειδιά EC (kty=EC στις καμπύλες P-256, P-384, P-521). Άλλοι τύποι (OKP για Ed25519, οκτ για τα συμμετρικά κλειδιά) δεν μετατρέπονται: αναφέρονται με μήνυμα σφάλματος από εισόδου, το υπόλοιπο JWKS παραμένει αναγνώσιμο.

  • Η μετατροπή γίνεται προς μία κατεύθυνση: JWKS σε PEM. Το Η ανοικοδόμηση ενός JWK από ένα υπάρχον κλειδί PEM δεν καλύπτεται από αυτό έκδοση.
  • Το JWKS πρέπει να επικολληθεί ως έχει ως κείμενο JSON. Ανάκτηση αυτόματη από μια διεύθυνση URL jwks_uri ή ένα τελικό σημείο OIDC δεν έχει ολοκληρωθεί διακομιστή, για αποφυγή απροσδόκητων εξερχόμενων κλήσεων.
  • Τα ιδιωτικά κλειδιά δεν υποτίθεται ότι εμφανίζονται σε ένα δημόσιο JWKS και αυτό το εργαλείο δεν εξάγει από τα δημόσια στοιχεία, ακόμη και αν υπήρχε ιδιωτικό κλειδί.

Πώς να το χρησιμοποιήσετε

  1. Ανακτήστε το JWKS του πομπού που θέλετε να επιθεωρήσετε. Για έναν πάροχο OIDC, η διεύθυνση είναι συνήθως https://example.com/.well-known/jwks.json ή https://example.com/oauth2/jwks.
  2. Αντιγράψτε ολόκληρο το έγγραφο JSON (το αντικείμενο που περιέχει το κλειδί keys).
  3. Επικολλήστε το στο πλαίσιο εισαγωγής εργαλείου και ξεκινήστε την ανάλυση.
  4. Για κάθε κλειδί JWKS, το εργαλείο εμφανίζει το kid του, το kty του, το Το alg, η χρήση του και το δημόσιο κλειδί μετατράπηκε σε μορφή PEM.
  5. Κάντε κλικ στο "αντιγραφή" για να ανακτήσετε το PEM και να το χρησιμοποιήσετε σε ένα σενάριο επαλήθευσης, στο Ο JWT Verifier μας ή σε οποιοδήποτε συμβατό εργαλείο OpenSSL.

Συχνές ερωτήσεις

Πού μπορώ να βρω το JWKS ενός παρόχου OIDC;

Η συντριπτική πλειοψηφία των παρόχων OpenID Connect δημοσιεύουν ένα έγγραφο εντοπισμού https://example.com/.well-known/openid-configuration. Αυτό το JSON περιέχει ένα πεδίο jwks_uri που δείχνει το πραγματικό JWKS. Ορισμένοι προμηθευτές εξυπηρετούν απευθείας το JWKS σε https://example.com/.well-known/jwks.json ή σε τελικό σημείο OAuth2 αφιερωμένο. Κατεβάστε το περιεχόμενο και επικολλήστε το εδώ ως έχει.

Γιατί είναι σημαντικό το παιδί;

Το kid (αναγνωριστικό κλειδιού) είναι το αναγνωριστικό που βάζει η κεφαλίδα ενός JWT στο δικό του πεδίο kid για να υποδείξετε ποιο κλειδί JWKS πρέπει να χρησιμοποιηθεί για επαλήθευση. Χωρίς αυτό αναγνωριστικό, ο καταναλωτής θα πρέπει να επιχειρήσει κάθε κλειδί του JWKS, γεγονός που περιπλέκει τη διάγνωση κατά περίπτωση λάθους. Επομένως, η παρουσία παιδιού ανά κλειδί θεωρείται καλό πρακτικό και όλοι οι σοβαροί IdP δημοσιεύουν ένα.

Ποια είναι η διαφορά μεταξύ kty=RSA και kty=EC;

Το RSA είναι η ιστορική οικογένεια ασύμμετρων υπογραφών, που χρησιμοποιείται με τα RS256, RS384, RS512. Το Τα κλειδιά περιγράφονται από ένα modulo n και έναν εκθέτη e. EC (Ελλειπτικό Curve) είναι πιο πρόσφατη και δίνει μικρότερες υπογραφές για ισοδύναμο επίπεδο ασφάλειας. Τα κλειδιά EC περιγράφονται από μία καμπύλη (crv = P-256, P-384 ή P-521) και δύο Συντεταγμένες x και y. Αυτό το εργαλείο μετατρέπει και τις δύο οικογένειες σε PEM.

Πώς να χρησιμοποιήσετε το εξαγόμενο PEM για να επαληθεύσετε ένα JWT;

Αντιγράψτε το PEM και, στη συνέχεια, επικολλήστε το στο πεδίο "δημόσιο κλειδί" μας JWT Verifier με το JWT για επικύρωση. Μπορείτε επίσης χρησιμοποιήστε το από τη γραμμή εντολών με openssl dgst, από το Node.js με crypto.verify, από Python με κρυπτογραφία ή PyJWT, από Java με JCA, κ.λπ. Η μορφή PEM αναγνωρίζεται παγκοσμίως.

Το JWKS μου περιέχει ένα κλειδί Ed25519 (OKP), γιατί δεν μετατρέπεται;

Η μετατροπή των κλειδιών OKP (Ed25519, Ed448, X25519, X448) απαιτεί λογική συγκεκριμένη και μια κωδικοποίηση DER διαφορετική από αυτή των κλειδιών RSA και EC. Αυτή η έκδοση του εργαλείου δεν το κάνει υποστηρίζει μόνο RSA και EC. Αναφέρονται τα μη διαχειριζόμενα κλειδιά μεμονωμένα με μήνυμα σφάλματος, χωρίς αποκλεισμό της ανάλυσης άλλων καταχωρήσεων JWKS.

Μπορούμε να ανακτήσουμε το JWKS από μια διεύθυνση URL αντί να το επικολλήσουμε;

Όχι σε αυτή την έκδοση. Το εργαλείο δεν πραγματοποιεί εξερχόμενες κλήσεις HTTP για να παραμείνει γρήγορη και να αποφευχθεί να ενεργεί ως ακούσιος πληρεξούσιος. Κατεβάστε το JWKS από το πρόγραμμα περιήγησής σας ή με κουμπώστε https://example.com/.well-known/jwks.json και μετά επικολλήστε το περιεχόμενο στο πεδίο είσοδος.

Παράδειγμα αιτήματος

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

Σχήμα εισόδου

Πεδίο Τύπος Απαιτείται Προεπιλογή
jwks text

Σημεία πρόσβασης

  • GET https://cdrn.fr/api/v1/tools - εμφανίζει όλα τα διαθέσιμα εργαλεία
  • GET https://cdrn.fr/api/v1/tools/jwks-inspector - ανακτά το σχήμα αυτού του εργαλείου
  • POST https://cdrn.fr/api/v1/tools/jwks-inspector/execute - εκτελεί αυτό το εργαλείο με payload JSON