Esiste assolutamente un meccanismo che esiste per fare questo: HTTPS.
(So cosa stai pensando - leggi fino alla fine del post prima di decidere che non è quello che vuoi!)
Innanzitutto, HTTPS è semplicemente HTTP costruito su SSL, quindi avere una conoscenza approfondita di SSL sarà vantaggioso.
Normalmente, le connessioni SSL utilizzate sul web riguardano solo l'autenticazione del server. Tuttavia, esiste un modo in cui server può autenticare il client anche essendo la propria CA ed emettendo un certificato per il client. Questa funzione è stata integrata nel protocollo SSL come passaggio facoltativo nel caso in cui si desideri un'autenticazione a due vie (in modo molto simile a ciò che si richiede).
Ecco una panoramica di come funziona:
- Il client avvia una connessione con il server, richiedendo il suo certificato.
- Il server risponde inviando il certificato al client. Una parte facoltativa di questo passaggio è che il server può anche sfidare il client richiedendo un certificato. La maggior parte dei siti web non lo fa. Questo è ciò che desideri abilitare sul tuo sito.
- Il client autentica il certificato del server è valido utilizzando la chiave pubblica della CA per decodificare il certificato (se i dati corrispondono, allora è noto che il certificato ha proveniente dalla CA, come solo la CA ha la chiave privata per generare certificati).
- Il client invia una chiave simmetrica al server (crittografata usando una chiave pubblica nel certificato del server). Se il server ha richiesto un certificato, il client invia anche il suo certificato al server.
- Il server autentica il client. Di solito ciò accade dal server stesso che assume il ruolo della CA e determina che il certificato ha effettivamente origine da questo server. Questo passaggio si verifica solo se il server ha contestato il client.
- Utilizzando la chiave simmetrica crittografata inviata dal client, il server determina quale sarà la chiave simmetrica e restituirà una conferma al client.
- A questo punto la stretta di mano è terminata. Tutta l'ulteriore corrispondenza si verifica utilizzando un semplice algoritmo di crittografia a chiave simmetrica.
Ora arriva la domanda: come fa il cliente a ottenere il certificato in primo luogo? Prima di tutto, hai bisogno di un modo sicuro per emettere un certificato. Hai citato le smart card (che possono essere buone. Un semplice jump drive è buono anche se sei certo che non cadrà nelle mani sbagliate). Se stiamo parlando di sicurezza a livello di CIA, allora non c'è una risposta facile (o economica) su come distribuire il certificato: dovrai usare il tuo stesso giudizio e fare i compiti su questo.
Una volta che l'utente ha il certificato, tutti i principali sistemi operativi hanno meccanismi per installare il certificato in modo che il computer sia abbastanza intelligente da rispondere automaticamente con il certificato corretto. Trovare informazioni su come farlo non dovrebbe essere difficile (l'ho fatto prima e non ricordo troppi problemi nel trovare informazioni sull'argomento).
Sfortunatamente, ho sempre avuto a che fare con un client quando lavoro con questo, ma questi link (e qualsiasi altra cosa che appare sotto una ricerca di Google per "Autenticazione client SSL") dovrebbero aiutarti:
Suppongo che tu sappia già che questo porterà mal di testa ai tuoi clienti, quindi fallo solo se sei sicuro al 100% che un semplice accesso web con la crittografia HTTPS più basilare non è quello che vuoi.
Buona fortuna, e spero che questo aiuti.