Facile spiegazione dei certificati client SSL per uno sviluppatore

8

Ho pensato di utilizzare i certificati client per le mie app Web, sperando disperatamente che gli utenti attenti alla sicurezza mettessero la loro chiave privata su HSM in modo che non venissero rubati anche se la macchina fosse compromessa e il vantaggio aggiuntivo di anche dimenticarsi completamente della pagina di login (l'utente verrebbe loggato dalla prima richiesta fino a quando viene presentato il certificato del cliente).

Tuttavia, da quello che ho letto sembra così complicato da implementare e sono completamente perso (mi vergogno abbastanza di fare una domanda simile a un principiante).

Dovrei davvero gestire un PKI e rilasciare i certificati io stesso? Se ogni sito esegue questa operazione, gli utenti dispongono di un'intera cartella piena di certificati diversi, che equivale a passwords.txt in termini di usabilità. Anche se tutti (ad esempio i siti rari che utilizzano certificati client) lo fanno, vorrei evitare di aggiungere ancora un altro cert in quella directory, se possibile, e consentire agli utenti di riutilizzare i certificati che hanno già, se del caso.

C'è un modo per farli comportarsi proprio come le chiavi SSH, l'utente presenta una chiave durante la registrazione e quella chiave è legata all'account?

A proposito di verificarle nella mia app, la maggior parte della documentazione che ho trovato fa sì che il web server controlli i certificati contro una CA (la mia CA in questo caso, che ci riporta al problema PKI) e impostando una variabile di ambiente se la cert è fidato ... non funzionerebbe nel mio caso, perché mi piacerebbe sbarazzarmi della CA e chiedere ai clienti di fornire i propri certificati, in base al fatto che non posso affidarmi a controllarli CA, come posso controllarli? I certificati client hanno l'equivalente della chiave pubblica SSH che posso semplicemente archiviare nel mio DB e controllare quello?

Infine, come potrebbe un nuovo cliente iscriversi al mio sito web; gli viene chiesto di presentare un certificato e lui non ne ha, come ne genera uno?

    
posta 17.02.2015 - 00:56
fonte

6 risposte

3

Modifica: mi rendo conto che questo potrebbe non essere chiaro dalla risposta in basso ... ma dal punto di vista della tua applicazione, non fa alcuna differenza se esegui la PKI / CA stesso o se si utilizzano una o più CA di terze parti. Anche se scegli di eseguire il tuo PKI, veramente non vuoi codificarlo tu stesso, quindi utilizzeresti uno di quelli esistenti, che sarebbero logicamente separati dall'applicazione e qualsiasi l'interazione con l'AC avverrebbe tramite i consueti protocolli. Fine modifica

Should I really be operating a PKI and issuing the certs myself?

Come regola generale, se non sai già come eseguire una PKI, non dovresti farlo. È un lotto più complicato di quanto si pensi, e molti più modi in cui le cose possono andare storte. Anche le aziende che fanno PKI come core business a volte sbagliano; vedi Diginotar che ha fatto hackerare la propria infrastruttura di certificazione e alla fine è fallita .

Consentire i certificati di terze parti, in particolare da più CA, presenta le proprie insidie. Ho una smartcard che contiene il mio ID elettronico che utilizzo per accedere alla mia banca ea diversi siti governativi. Ma potrei anche avere un certificato "soft" che uso per accedere ad altre cose. Se il tuo sito accetterebbe entrambe le autorità di certificazione, avresti modo di sapere che quei due certificati si riferiscono alla stessa persona (o utente)? Vorresti voler avere un utente per certificato o vorresti che un utente fosse in grado di utilizzare più di un certificato? Cosa succede quando scade un certificato? Come sapresti che il mio nuovo certificato si riferisce ancora a me? Queste domande devono essere considerate attentamente quando progetti le tue applicazioni e le tue catene di fiducia.

Is there a way of making them behave just like SSH keys, the user presents any key during signup and that key is bound to the account?

Questa è solo una piccola questione di programmazione ... (In altre parole, non così piccola, ma non impossibile.) Probabilmente vorrai che l'utente aggiunga / rimuova anche i certificati.

About verifying them in my app, most documentation I've found makes the web server check the certs against a CA (my own CA in this case, which brings us back to the PKI problem) and setting an environment variable if the cert is trusted ... that wouldn't work in my case as I'd like to get rid of the CA and have the clients provide their own certs, so based on the fact that I can't rely on checking them against a CA, what can I check them against? Do client certs have the equivalent of the SSH public key I can just store in my DB and check against that?

Non salverei l'intero certificato, risparmieresti solo abbastanza informazioni da poter verificare il certificato la prossima volta che l'utente lo presenta. Questo di solito è il numero di serie del certificato, il CN e la CA di emissione. Potresti anche voler memorizzare la data di scadenza, in modo che tu possa ricordare agli utenti di rinnovare i loro certificati prima che scadano. (Questo potrebbe naturalmente essere fatto quando si controllano i loro certificati al momento del login, ma potrebbe essere saggio memorizzare i dati in modo da poter inviare un promemoria via e-mail nel caso in cui non effettuino l'accesso durante il tempo in cui avrebbero ricevuto l'avviso.)

Anche quando un certificato viene rilasciato da una CA di terze parti, il certificato conterrà informazioni su come è possibile verificarne la validità. Questo di solito avviene tramite OCSP (Online Certificate Status Protocol), che è un controllo in tempo reale contro il database della CA emittente. C'è anche CRL, un elenco di revoche di certificati, che contiene informazioni su quali certificati sono revocati dalla CA. Questo non è in tempo reale; il CRL sarà riemesso a intervalli.

Finally, how would a new customer go about signing up to my website; he's asked to present a cert and he doesn't have any, how does he generate one?

Se si sceglie di utilizzare CA di terze parti, è necessario fornire loro un collegamento a una o più CA di fiducia.

Se esegui la tua CA, fornirai loro un collegamento a tale CA, che dovrebbe essere configurato per consentire agli utenti (precedentemente) anonimi, nonché agli utenti esistenti, di richiedere un nuovo certificato.

Infine, se vuoi dare un'occhiata all'impostazione di un PKI, puoi provare EJBCA, un CA / VA open source . Vi darà un'idea di base delle complessità coinvolte.

    
risposta data 24.03.2015 - 11:23
fonte
2

Lavoro per un'azienda di test di penetrazione che richiede un certificato client per accedere a uno dei nostri host di test. I certificati richiedono l'inserimento di una passphrase durante l'autenticazione. Questo viene fatto come un layer aggiunto di sicurezza, non per sostituire la necessità di password. Se il certificato non richiede una passphrase, allora sì - lasciare che qualcuno prenda possesso della chiave è tanto pessimo quanto fornire le proprie credenziali.

    
risposta data 19.03.2015 - 14:58
fonte
1

Sia l'obiettivo che l'approccio sono piuttosto discutibili.

Gli utenti non dispongono di HSM nel proprio PC (a meno che non si stia lavorando in un'azienda molto speciale che in qualche modo fornisce ai propri dipendenti hardware crittografico). Nella migliore delle ipotesi, incontrerai un utente con una smartcard, ma anche in quel caso probabilmente non useranno la scheda per il tuo sito, perché è troppo ingombrante. Un'ipotesi più realistica è che gli utenti mantengano semplicemente le chiavi private sul loro HDD, con una passphrase debole o senza passphrase. Quindi, se il PC viene compromesso, la chiave viene compromessa. Ciò non significa che l'autenticazione a chiave pubblica sia inutile, ma le tue ipotesi sembrano essere eccessivamente ottimistiche.

I certificati client non eliminano nemmeno la necessità di un meccanismo di accesso. Il browser chiederà all'utente di scegliere un certificato e inserire la passphrase, che non è molto diversa da un modulo di log-in standard (solo più brutto). Allo stesso tempo, i tuoi utenti ora devono preoccuparsi di eseguire il backup della chiave e del certificato, devono forse trovare un modo per trasportarli in sicurezza su una macchina diversa e devono ottenere un nuovo certificato se la chiave viene persa o compromessa . Quindi in realtà è più lavoro.

Inoltre non sono d'accordo con il tuo approccio. La crittografia a chiave pubblica di HTTPS si basa su un modello di fiducia molto specifico, ovvero un'infrastruttura X.509 con CA hi-search. Potresti preferire un modello diverso, ma è così che funziona il protocollo, ed è così che viene implementato da tutti i server e i client rilevanti. Cercando di "hackerare" la convalida del certificato terminerà probabilmente in un disastro (come mostrano alcune delle risposte precedenti). Quindi no, non c'è una via d'uscita facile.

Se speri che i certificati client siano sia super sicuri che super convenienti, rimarrai deluso. Loro non sono. Mentre possono essere più sicuri delle password, questo ha un prezzo: più lavoro per te, più lavoro per i tuoi utenti e molta più complessità per la tua applicazione.

    
risposta data 22.03.2015 - 23:52
fonte
0

Un certificato autofirmato funzionerà efficacemente come chiave pubblica SSH. Dovrai aggiungere ogni certificato utente al tuo elenco di CA affidabili. Se un utente non ha già un certificato, è possibile crearlo utilizzando lo script java nel browser durante la registrazione. È possibile chiedere all'utente di memorizzare i propri certificati di chiave privata crittografati con password sicure, quindi non è esattamente la stessa cosa di avere un semplice testo password.txt. I certificati privati verranno crittografati e archiviati e potranno essere sbloccati solo con la password. Quando il sito web / webapp vuole autenticare, cercherete (o l'utente seleziona il certificato privato appropriato, che è un problema di usabilità) il cert corrispondente e all'utente verrà richiesto di inserire la password per il certificato privato da utilizzare .

    
risposta data 17.02.2015 - 01:33
fonte
0

È davvero una buona idea?

Sì, potrebbe funzionare, ma ... In caso di un semplice attacco MITM , cosa succederà?

  1. Il tuo server non riconoscerà il certificato del client hacker e tornerà alla pagina di accesso.
  2. L'utente reinserirà naturalmente le sue credenziali e quindi potrebbe funzionare di nuovo normalmente.
  3. Ma da lì, il tuo server accetterà il certificato di hacker, poiché il client lungo non tenta di connettersi di nuovo da altrove.
  4. La tua sicurezza è compromessa.

Naturalmente, il secondo passaggio non è una vera prova, ma poiché social engineering rimane il primo modo di fare errori di sicurezza, non ci si può aspettare che i tuoi utenti debbano preoccuparsi!

    
risposta data 22.03.2015 - 18:22
fonte
-1

StartSSL fornisce certificati server Web di classe 1 gratuiti (SSL / TLS) e amp; Client e certificati di posta (S / MIME). Li uso sia per il mio sito web che per la posta elettronica. La verifica viene eseguita automaticamente e i tuoi clienti ottengono spesso i certificati quasi istantaneamente.

Questo è meglio di te che gestisci un PKI ed emetti i certificati da solo. È possibile verificare il certificato del client rispetto al certificato radice della CA StartSSL e convalidare l'utente nell'app (in questo modo funziona il login StartSSL PKI e funziona perfettamente).

Avere una PKI di terze parti si prende cura anche dei nuovi clienti che non dispongono di certificati reindirizzandoli automaticamente attraverso una generazione di certificati comprovata e un'autorità di gestione delle chiavi come StartSSL.

P.S. Non sono in alcun modo affiliato con StartCOM o StartSSL. Io uso i loro servizi gratuiti da solo, quindi li sto solo raccomandando in questo caso.

    
risposta data 22.03.2015 - 22:41
fonte

Leggi altre domande sui tag