Capisco la PKI ragionevolmente bene da un punto di vista concettuale - cioè chiavi private / chiavi pubbliche - la matematica dietro di loro, l'uso di hash e crittografia per firmare un certificato, firma digitale di transazioni o documenti ecc. Ho anche lavorato su progetti in cui openssl Le librerie C sono state utilizzate con certificati per garantire la comunicazione e l'autenticazione. Conosco anche gli strumenti della riga di comando di openssl.
Tuttavia, ho pochissima esperienza con progetti abilitati PKI basati sul web e quindi sto cercando di progettare e codificare un progetto personale per capirlo meglio.
I requisiti
Questo è il sito Web di una banca. A tutti gli utenti di Internet Banking è consentito utilizzare qualsiasi certificato emesso da alcune CA conosciute (verisign, Thawte, affidust ecc.). La Banca non è responsabile per l'acquisizione di certificati per l'utente. Questi certificati verranno utilizzati per l'autenticazione sul sito Web delle banche. Le piattaforme / SO ecc. Non sono ancora stati corretti.
Design
Mi chiedevo quale fosse il modo migliore per eseguire l'autenticazione.
Ho visto che Apache ha un modo per abilitare ssl a 2 vie - in questo caso, penso che navigare sul sito web richiederebbe automaticamente un certificato all'utente. Ma non sono sicuro che questo sia sufficiente perché sembra che tutto ciò che verifica sia se un certificato è firmato da un'autorità di certificazione attendibile e potrebbe anche essere se rientra in una lista bianca di argomenti dei certificati ecc. Ma questo non è abbastanza per un caso bancario perché è necessario poter associare un bankuserid a un certificato.
Sembra che IIS abbia un modo per archiviare un certificato per ciascun utente in Active Directory. Questo è quello che ho capito leggendo alcuni articoli MSDN. Si attiva SSL a 2 vie in IIS e quindi quando l'utente tenta di accedere al sito Web, IIS invierà una richiesta al browser con un elenco di CA approvate e il browser consentirà all'utente di scegliere un certificato appropriato dal proprio certstore e inviarlo backend. Suppongo che IIS farà 2 cose
- Assicurarsi che l'utente disponga della chiave privata corrispondente al certificato (secondo le trattative di copertura)
- Sulla base della mappatura dei certificati utente-utente AD, IIS segnalerà il nome utente all'applicazione.
Esegui esplicitamente l'autenticazione chiamando le funzioni di crittografia piuttosto che dipendono dal server web per farlo.
- Mostra una schermata utente in cui carica un certificato e l'applicazione assicura che l'utente disponga della chiave privata corrispondente al certificato (chiedendo al front-end di firmare una stringa usando il certificato).
- L'applicazione ha un database in cui sono memorizzati alcuni dati che consentono a ciascun utente di essere mappato sul proprio ID utente. Può essere
- l'intero certificato corrispondente a ciascun ID utente
- il numero di serie CA e certificato corrispondente a ciascun ID utente.
Mi chiedevo quale sia il metodo comunemente usato? Quali sono le migliori pratiche? Se dovessi scegliere il n. 3, quali sono i modi migliori per farlo?
Qualcosa che può anche funzionare facilmente con le app per smartphone sarà un ulteriore vantaggio.
Aggiornare
Permettetemi di chiarire la mia affermazione "codifica me stesso la parte di autenticazione" perché alcune delle risposte sembrano indicare che è stata fraintesa - il mio male per non essere chiaro.
Questo non significa che scrivo cose crittografiche da solo. Significa solo che in realtà chiamerò esplicitamente le routine di crittografia invece di dipendere da IIS o da qualsiasi altro server web che lo faccia implicitamente.