it-swarm.dev

È possibile utilizzare una chiave GPG o SSH per l'autenticazione basata sul Web in modo sicuro?

Diciamo ipoteticamente che sto scrivendo un'applicazione web destinata a utenti tecnicamente inclini e attenti alla sicurezza che non hanno problemi a generare e utilizzare chiavi GPG o SSH.

È possibile utilizzare dette chiavi per autenticarsi con un'applicazione Web in modo sicuro in sostituzione dell'autenticazione tradizionale basata su password?

Se è possibile, come saranno i passaggi dell'autenticazione? Esiste forse una buona implementazione nota di tale idea per linguaggi e piattaforme popolari come Ruby, .NET, Java o Python?

Se non è possibile, quali sono le ragioni? Esiste forse un vincolo per i browser Web che accedono al portachiavi GPG o al file chiave SSH?

36
user10211

Per un'applicazione Web, il problema principale è che il codice del sito Web (Javascript in un browser) non è in grado di leggere e scrivere file a piacimento. Bene, in generale, questo è più un vantaggio che un problema, ma qui significa che il codice Javascript non sarà in grado di accedere alle chiavi private SSH o PGP.

Ci sono cose che possono essere fatte, a seconda di quanto esperti di tecnologia sono i tuoi utenti e quante operazioni manuali tollereranno:

  • È possibile utilizzare un'estensione del browser installata localmente che accede alle chiavi private SSH o PGP per conto del sito Web. Preferibilmente, è consigliabile un certo controllo utente: non vogliamo davvero un browser che firmi le cose solo perché un sito Web ha detto di farlo.

  • Il server può fungere da server SSH e richiede ai client di connettersi con SSH e l'autenticazione client basata su chiave. L'utente eseguirà SSH in modalità "proxy SOCKS". Il server Web stesso ascolterebbe solo localhost, vale a dire non raggiungibile se non attraverso un proxy locale. In questa modalità, il server Web potrebbe persino essere HTTP, non HTTPS; questo significherebbe davvero sostituire SSL con SSH. Sul lato server, tenere traccia degli utenti dovrebbe usare mod_ident o qualcosa di simile (il server SSH sa chi è il client, ma le informazioni devono essere inoltrate al server HTTP; fortunatamente, questo è lo stesso macchina, quindi è possibile utilizzare l'identità di livello Unix).

  • Il sito Web potrebbe visualizzare una "sfida" come file scaricabile con contenuti casuali. L'utente ottiene il file, lo firma con GnuPG e incolla l'output (con armatura ASCII) in un campo di testo sul sito Web. Il server verifica la firma e la accetta come autenticazione dell'utente (a condizione che il server conosca già la chiave pubblica dell'utente). Clunky, ma funziona.

Una variante basata sulla posta di quanto sopra può essere consigliabile, poiché le implementazioni PGP sono spesso incorporate nel software di posta elettronica e anche perché apre la possibilità di non fidarsi di una CA radice esterna. Sarebbe così:

  • L'utente si connette al server Web con HTTPS. Il server utilizza un certificato autofirmato. Il browser lo avverte (l '"avviso rosso spaventoso") ma consente all'utente di procedere.

  • Nel sito, l'utente inserisce il suo nome. Quindi il server invia all'utente e-mail firmata e crittografata (con PGP) per l'utente; l'e-mail firmata contiene un nonce casuale e anche una copia dell'identificazione personale del certificato SSL del server. Il nonce casuale viene anche stampato sul sito Web stesso.

  • L'utente verifica la firma PGP sull'e-mail del server, quindi verifica che l'identificazione personale corrisponda a quella che può vedere dal suo browser; questo convince l'utente che sta vedendo il certificato del server originale, quindi non è in corso attacco man-in-the-Middle . (Qui sostituiamo il sistema CA X.509 con la convalida basata su PGP.)

  • L'utente verifica inoltre che il nonce visualizzato sul sito Web corrisponda a quello che vede nell'email (questo è importante).

  • L'utente risponde all'e-mail rinviandone i contenuti, questa volta firmato con la propria chiave privata PGP e crittografato con la chiave pubblica del server. Il server verifica quell'email e quindi sa che il valore nonce è stato effettivamente ricevuto dall'utente previsto.

  • Il server invia il valore nonce come cookie al browser dell'utente. Ciò consente la navigazione senza disturbare l'utente con ulteriori cicli di autenticazione. Spetta al server decidere per quanto tempo accetterà il cookie come token di autenticazione valido.

Nello schema sopra, è importante notare che inviando indietro la sua risposta e-mail, l'utente sta davvero autorizzando il server ad assumere che chiunque ritorni con il nonce (come incluso nell'e-mail) è davvero l'utente stesso. Questo è il motivo per cui è importante verificare manualmente che il nonce corrisponda a quanto mostrato nella pagina Web.

17
Thomas Pornin

È possibile utilizzare le coppie di chiavi OpenPGP/SSH per eseguire l'autenticazione con un'applicazione Web in modo sicuro in sostituzione dell'autenticazione tradizionale basata su password?

Sì. È del tutto possibile.

Se possibile, come saranno i passaggi dell'autenticazione? Esiste forse una buona implementazione nota di tale idea per linguaggi e piattaforme popolari come Ruby, .NET, Java o Python?

Vedi la mia risposta per la prossima domanda.

Se non è possibile, quali sono i motivi? Esiste forse un vincolo per i browser Web che accedono al portachiavi GPG o al file chiave SSH?

L'elaborazione di chiavi SSH e OpenPGP in un'app Web è possibile con librerie di terze parti (in particolare C o Java data la loro ricca ecologia), ma ti perderai a sfruttare la soluzione esistente più comune - SSL/TLS.

La scommessa migliore sarebbe che gli utenti generassero il certificato client X509 firmato dal tuo server per autenticarsi - perché la tua app web può semplicemente fare affidamento sul contenitore web (Catalina Tomcat, ApacheD, IIS, ecc.) Per eseguire crittografia e autenticazione senza interruzioni per il tuo applicazione.

Le chiavi OpenPGP hanno gli stessi esponenti RSA di un certificato X509, quindi strumenti come openssl possono convertire le chiavi GPG/PGP in certificati auto-firmati * X509; lo stesso per chiavi SSH .

* La web-of-trust di OpenPGP si qualifica come 'autofirmata' dal punto di vista X509 perché X509v3 non può avere una catena di fiducia a radice multipla, per quanto sono stato in grado di determinare.

8
LateralFractal

Le risposte esistenti offrono buoni consigli: utilizzare invece lo stack SSL nel browser.

Tuttavia, in realtà è possibile fare esattamente quello che vuoi - usando la crittografia JavaScript.

C'è un'implementazione di OpenPGP in JavaScript http://openpgpjs.org/ Non posso garantire per la sua qualità.

Inoltre, è possibile che HTML5 JavaScript acceda ai file locali, ad es. http://www.html5rocks.com/en/tutorials/file/dndfiles/

Penso che questo sarebbe più una curiosità che un sistema pratico però.

4
paj28