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.