Verifica della firma di un JWT (RS256 ed ES256, con chiave pubblica)

Strumento per sviluppatori che verifica all'istante i gettoni JWT firmati con RS256 o ES256, servendosi di una chiave pubblica in formato PEM di tipo SPKI. Mostra insieme il risultato della decodifica di intestazione e contenuto e la scadenza. Nulla di quanto inserite viene trasmesso a un servente: tutto avviene nel navigatore.

Gli algoritmi di firma previsti

Algoritmo Tipo di chiave Funzione di sintesi Descrizione
RS256 RSA (RSASSA-PKCS1-v1_5) SHA-256 Firma con crittografia a chiave pubblica RSA. È l'algoritmo predefinito e standard che i principali fornitori di identità — Google, Auth0, Okta — usano per i gettoni di identità.
ES256 ECDSA (curva ellittica P-256) SHA-256 Firma con crittografia a curve ellittiche, che offre una sicurezza equivalente a RSA con chiavi e firme molto più brevi. Se ne diffonde l'adozione nelle applicazioni per dispositivi mobili e negli apparecchi connessi, dove conta contenere la quantità di dati.

Verificare la firma di un JWT con una chiave pubblica

Questo strumento verifica un JWT firmato con RS256 o ES256 a fronte di una chiave pubblica in PEM nel formato SPKI. Mostra l'intestazione e il carico utile decodificati accanto alla scadenza. Tutto ciò che inserite viene elaborato dentro il browser e non è mai inviato altrove.

Merita sottolineare che una firma valida e un token valido sono due cose distinte. Che una firma si verifichi prova unicamente che il contenuto non è stato riscritto dopo l'emissione. L'autenticazione vera richiede inoltre di controllare che exp per la scadenza, nbf per l'istante da cui vale, iss per l'emittente e aud per il destinatario previsto concordino con ciò che vi attendete. L'altro inciampo ben noto nell'implementazione consiste nel lasciare che sia l'intestazione stessa del token a decidere con quale algoritmo verificare. Se il server non fissa in anticipo l'alg accettabile, lascia quella scelta a portata di un aggressore.

Come verificare

  1. Incollate il JWT È una stringa di tre parti separate da punti.
  2. Incollate la chiave pubblica in formato PEM Occorre la chiave pubblica, non quella privata. RS256 prende una chiave RSA ed ES256 una chiave sulla curva P-256.
  3. Verificate la firma Lo strumento riferisce se chiave e firma concordano.
  4. Controllate il contenuto decodificato e la scadenza Un token la cui firma si verifica non va comunque usato una volta scaduto. Guardate entrambe le cose.

Consigli per sfruttarlo al meglio

  • La chiave pubblica deve essere in formato PEM di tipo SPKI, cioè cominciare con «-----BEGIN PUBLIC KEY-----». Incollando un file di chiave privata o un certificato la verifica non riesce.
  • L'algoritmo di verifica si sceglie automaticamente in base al valore del campo alg nell'intestazione del gettone, RS256 oppure ES256: non occorre alcuna selezione manuale.
  • Insieme alla firma si controlla anche la dichiarazione exp del contenuto e, in caso di scadenza superata, compare un avviso. Un gettone scaduto va comunque rifiutato, anche se la firma è corretta.
  • Lo strumento prevede soltanto RS256 ed ES256. Per esaminare un gettone firmato con un metodo a chiave condivisa come HS256, potete rifirmarlo con la stessa chiave nel codificatore di JWT e confrontare i risultati.
  • La chiave pubblica usata nella verifica non è un'informazione riservata: potete incollare senz'altro quella ottenuta dai punti di accesso pubblici del vostro fornitore di identità.

Quando torna utile

Nell'esaminare il contenuto di un token di identità

Un token emesso da un fornitore di identità si può riscontrare con la sua chiave pubblica.

Nel distinguere una chiave sbagliata da una firma guasta

Quando la verifica fallisce, potete stabilire sul posto quale delle due sia in causa.

Nel provare una rotazione delle chiavi

Provare a turno la chiave vecchia e quella nuova conferma che il ricambio si svolgerà come previsto.

Nel risalire alla causa di un guasto

Di fronte a una segnalazione di autenticazione fallita, potete stabilire per prima cosa se sia il token stesso a esserne responsabile.

Termini della verifica di un JWT

RS256
Un procedimento di firma che usa una chiave RSA con SHA-256. Firmare richiede la chiave privata, verificare quella pubblica.
ES256
Un procedimento di firma che usa la curva P-256 con SHA-256. Tanto la chiave quanto la firma riescono più corte che con RSA.
SPKI
La forma normalizzata in cui viene portata una chiave pubblica. In PEM si apre con -----BEGIN PUBLIC KEY-----.
Exp
La rivendicazione che dà la scadenza. Per quanto impeccabile sia la firma, un token oltre quell'istante non va accettato.
Nbf
La rivendicazione che indica da quale istante il token diventa utilizzabile. Prima di allora non è ancora in vigore.
Confusione di algoritmi
Una debolezza delle implementazioni che verificano con l'algoritmo indicato dall'intestazione del token. Il procedimento accettato va fissato dal lato che verifica.

Domande frequenti

Soltanto RS256 ed ES256. Gli algoritmi HS256, HS384 e HS512 sono a chiave condivisa e non si possono verificare con il solo inserimento di una chiave pubblica. Per esaminare una firma HS256 potete rifirmare il gettone con la stessa chiave nel codificatore di JWT e confrontare i risultati.

I fornitori di identità come Google, Auth0 e Okta distribuiscono le proprie chiavi pubbliche attraverso un punto di accesso pubblico, l'insieme delle chiavi web in formato JSON. Convertite quel JSON in formato PEM con un apposito strumento oppure usate la chiave pubblica riportata nella documentazione del servizio.

Le cause principali sono tre: la chiave pubblica inserita non forma coppia con la chiave privata che ha emesso il gettone; una delle tre parti del gettone è stata alterata o si è corrotta durante la trasmissione; qualche carattere si è perduto nella copia. Copiate di nuovo con esattezza sia la stringa del gettone sia la chiave pubblica dalla fonte originaria.

Al momento sono previsti soltanto RS256 ed ES256. Le varianti con funzioni di sintesi più lunghe — RS384, RS512, ES384, ES512 — sono allo studio come possibili aggiunte future.

Sì: la validità della firma e il superamento della scadenza sono giudicati separatamente e mostrati entrambi. Un gettone scaduto, anche se correttamente firmato, andrebbe di norma rifiutato dal sistema reale: verificate sempre anche l'avviso sulla scadenza.
Tool-kun

A proposito — che cosa distingue HMAC dalla firma a chiave pubblica

I metodi di firma dei JWT si dividono grosso modo in quelli a chiave condivisa, cioè HMAC come HS256, e in quelli a chiave pubblica, cioè RSA ed ECDSA come RS256 ed ES256. I primi richiedono che chi firma e chi verifica condividano la stessa stringa segreta, mentre nei secondi soltanto chi firma possiede la chiave privata e chiunque può verificare con la chiave pubblica. La differenza incide direttamente sulla ripartizione dei ruoli nella progettazione di un'interfaccia: lo strumento affine di codifica, fondato su HS256, si rivolge ai casi in cui emittente e verificatore coincidono nello stesso servente, mentre RS256 ed ES256, oggetto di questa pagina, ai casi in cui emittente e verificatore sono organizzazioni o serventi diversi.

Non a caso i gettoni di identità emessi dai principali fornitori — le implementazioni di OAuth 2.0 e OpenID Connect di Google, Auth0, Okta — sono quasi senza eccezione firmati con RS256, talvolta con la possibilità di scegliere ES256. In questo modo soltanto il fornitore firma con la propria chiave privata, mentre le innumerevoli applicazioni clienti verificano con la sola chiave pubblica: non occorre distribuire la chiave privata a tutti i clienti e il rischio di divulgazione resta confinato in un solo punto.

RS256 ed ES256 usano entrambi la funzione di sintesi SHA-256, ma differiscono nel metodo crittografico. RS256 si serve della crittografia RSA, di norma con chiavi di almeno 2048 bit, e produce firme piuttosto voluminose, ma vanta una realizzazione matura e un'ampia disponibilità di librerie. ES256 usa la crittografia a curve ellittiche P-256 e assicura una sicurezza equivalente con chiavi e firme assai più brevi: se ne diffonde perciò l'adozione negli ambienti mobili e nelle interfacce in cui conta contenere la dimensione dei dati.