2014-10-29 13 views
26

Con tutto il recente ronzio sulle specifiche FIDO U2F, vorrei implementare FIDO U2F test-saggio su un banco di prova per essere pronto per il prossimo lancio delle specifiche finali.Come utilizzare FIDO U2F per consentire agli utenti di autenticarsi con il mio sito web?

Finora, ho una chiave di sicurezza FIDO U2F prodotta da Yubico e l'estensione FIDO U2F (Universal 2nd Factor) installata in Chrome. Sono anche riuscito a impostare la chiave di sicurezza per lavorare con il mio log-in di Google.

Ora, non sono sicuro di come utilizzare questa roba per il mio sito. Ho controllato la pagina Github di Google per il progetto U2F e ho controllato il loro web app front-end. Sembra davvero semplice (solo JavaScript). Quindi implementare l'autenticazione del secondo fattore con FIDO è semplice come implementare alcune chiamate JavaScript? Tutto ciò che sembra accadere per la registrazione nell'esempio è questo:

 var registerRequest = { 
      appId: enrollData.appId, 
      challenge: enrollData.challenge, 
      version: enrollData.version 
     }; 

     u2f.register([registerRequest], [], function (result) { 
      if (result.errorCode) { 
     document.getElementById('status') 
      .innerHTML = "Failed. Error code: " + result.errorCode; 
     return; 
      } 
      document.location = "/enrollFinish" 
      + "?browserData=" + result.clientData 
      + "&enrollData=" + result.registrationData 
      + "&challenge=" + enrollData.challenge 
      + "&sessionId=" + enrollData.sessionId;    
     }); 

Ma come posso utilizzarlo personalmente per un'implementazione? Sarò in grado di utilizzare la richiamata da questo metodo per la registrazione dell'utente?

risposta

41

Quello che stai cercando di fare è implementare una cosiddetta "parte relying", nel senso che il tuo servizio web si baserà sull'affermazione dell'identità fornita dal token FIDO U2F.

Per capire, è necessario comprendere lo U2F specifications. Soprattutto come deve essere implementato il paradigma challenge-response e come funzionano gli ID delle app e le sfaccettature. Questo è descritto nelle specifiche in dettaglio.

Hai ragione: il codice effettivo necessario per utilizzare FIDO U2F dal front-end dell'applicazione è quasi banale (ovvero se si utilizza l'API JavaScript "di alto livello" anziché il "livello basso" "API MessagePort). La tua applicazione dovrà comunque funzionare con i messaggi generati dal token e convalidarli. Questo non è banale.

Per illustrare come si può perseguire l'implementazione di un sito di parti relying, fornirò alcuni esempi di codice, presi da uno Virtual FIDO U2F Token Extension che ho programmato di recente per ragioni accademiche. Puoi vedere la pagina per il codice di esempio completo.


Prima che gli utenti possano utilizzare i loro gettoni U2F FIDO per l'autenticazione, hanno bisogno di registro con voi. Per consentire loro di farlo, è necessario chiamare window.u2f.register nel proprio browser. Per fare ciò, è necessario fornire alcuni parametri (di nuovo, leggere le specifiche per i dettagli). Tra questi uno sfida e id della tua app. Per un'app Web, questo deve essere l'origine Web della pagina Web che attiva l'operazione FIDO. Supponiamo che è example.org:

window.u2f.register([ 
    { 
     version : "U2F_V2", 
     challenge : "YXJlIHlvdSBib3JlZD8gOy0p", 
     appId : "http://example.org", 
     sessionId : "26" 
    } 
], [], function (data) { 

}); 

Una volta che l'utente esegue un "test presenza utente" (per esempio toccando il token), si riceverà una risposta, che è un oggetto JSON (vedi specifiche per maggiori dettagli)

dictionary RegisterResponse { 
    DOMString registrationData; 
    DOMString clientData; 
}; 

Questi dati contengono diversi elementi con cui l'applicazione deve funzionare.

Register Map of a FIDO U2F Registration Response Message

  1. La chiave pubblica della coppia di chiavi generata - è necessario memorizzare questo per il futuro utilizzo di autenticazione.
  2. L'handle della chiave della coppia di chiavi generata - È inoltre necessario memorizzarlo per uso futuro.
  3. Il certificato: è necessario verificare se ci si fida di questo certificato e della CA.
  4. La firma: è necessario verificare se la firma è valida (vale a dire conferma la chiave memorizzata con il certificato) e se i dati firmati sono i dati previsti.

Ho preparato un rough implementation draft per il server relying party in Java che mostra come estrarre e convalidare queste informazioni ultimamente.


Una volta che la registrazione è completa e si deve in qualche modo memorizzati i dettagli della chiave generata, è possibile segno richieste.

Come hai detto, questo può essere avviato a breve e dolce attraverso l'alto livello di API JavaScript:

window.u2f.sign([{ 
    version : "U2F_V2", 
    challenge : "c3RpbGwgYm9yZWQ/IQ", 
    app_id : "http://example.org", 
    sessionId : "42", 
    keyHandle: "ZHVtbXlfa2V5X2hhbmRsZQ" 
}], function (data) { 

}); 

Qui, è necessario fornire la maniglia chiave, aver ottenuto durante la registrazione. Ancora una volta, dopo che l'utente esegue un "test presenza utente" (per esempio toccando il token), si riceverà una risposta, che è un oggetto JSON (ancora una volta, vedi specifiche per maggiori dettagli)

dictionary SignResponse { 
    DOMString keyHandle; 
    DOMString signatureData; 
    DOMString clientData; 
}; 

È la necessità di convalidare i dati della firma contenuti nel presente documento.

Register Map of a FIDO U2F Authentication Response Message

  1. È necessario assicurarsi che la firma corrisponde alla chiave pubblica che avete ottenuto in precedenza.
  2. È inoltre necessario verificare che la stringa firmata sia appropriata.

Dopo aver eseguito queste convalide, è possibile considerare l'utente autenticato. Un breve esempio di implementazione del codice lato server per quello è contenuto anche nel mio server example.

+0

Nota che Chrome richiede che l'appId sia https, restituirà un codice di errore se viene utilizzato http. Esistono soluzioni alternative descritte nel codice di riferimento di Chrome all'indirizzo https://github.com/google/u2f-ref-code#option-2-use-the-built-in-chrome-support –

15

Ho recentemente istruzioni per questo, così come listing all U2F server libraries (la maggior parte di loro fasci di un server demo completamente funzionante) scritto, a developers.yubico.com/U2F. L'obiettivo è di consentire agli sviluppatori di implementare/integrare U2F senza dover leggere le specifiche.

Disclaimer: Lavoro come sviluppatore presso Yubico.

+1

Sai se esiste un client -libraries? Ad esempio, per creare un emulatore Yubico Fido. – Muis

+3

@Muis nella terminologia FIDO, un _client_ è il software che comunica con il dispositivo U2F. Se è quello che vuoi, ci sono [un paio di lib] (https://developers.yubico.com/Software_Projects/FIDO_U2F/U2F_Host_Libraries) disponibili. Se quello che stai cercando è una versione software di un dispositivo U2F, dai un'occhiata a [virtual-u2f] (https://github.com/mplatt/virtual-u2f) di mritz_p, o alle classi di softkey utilizzate nelle suite di test delle librerie del server menzionate nella mia risposta originale. – minisu

Problemi correlati