Buongiorno! Vorrei condividere la mia esperienza su questo tema.
Routoken è una soluzione hardware e software nel campo dell'autenticazione, della protezione delle informazioni e della firma elettronica. Fondamentalmente, si tratta di una chiavetta USB che può contenere i dati di autenticazione utilizzati dall'utente per accedere al sistema.
In questo esempio è utilizzato il Routoken EDS 2.0.
Per utilizzare questo Routoken è necessario.
Per Windows, l'installazione di un semplice driver garantisce che il sistema operativo riconosca il vostro Routoken e che sia possibile lavorare con esso.
Con il Routoken è possibile interagire in vari modi. Si può accedervi dalla parte server dell'applicazione o direttamente dalla parte client. In questo esempio verrà esaminata l'interazione con il Routoken dalla parte client dell'applicazione.
La parte client dell'applicazione interagisce con il Routoken tramite il plugin Routoken. Si tratta di un programma che deve essere installato separatamente su ogni browser. Per Windows è sufficiente scaricare e installare il plugin, .
Ora possiamo interagire con Rutoken dalla parte client dell'applicazione.
In questo esempio viene presentata l'idea di implementazione di un algoritmo di autorizzazione dell'utente nel sistema utilizzando uno schema challenge-response.
L'idea di base è la seguente:
- Il client invia una richiesta di autorizzazione al server.
- Il server, in risposta alla richiesta del client, invia una stringa casuale.
- Il client completa questa stringa con 32 bit casuali.
- Il client firma la stringa ricevuta con il proprio certificato.
- Il client invia al server il messaggio codificato ricevuto.
- Il server verifica la firma, ottenendo il messaggio originale non codificato.
- Il server stacca gli ultimi 32 bit dal messaggio non codificato ricevuto.
- Il server confronta il risultato ricevuto con il messaggio che è stato inviato nella richiesta di autorizzazione.
- Se i messaggi sono identici, l'autorizzazione è considerata riuscita.
Nell'algoritmo sopra riportato esiste il concetto di certificato. Nel contesto di questo esempio, è necessario comprendere una certa teoria crittografica. Su Habr c'è .
In questo esempio utilizzeremo algoritmi di crittografia asimmetrica. Per implementare algoritmi asimmetrici è necessario avere una coppia di chiavi e un certificato.
La coppia di chiavi consiste in due parti: la chiave privata e la chiave pubblica. Come suggerisce il nome, la chiave privata deve rimanere segreta. La usiamo per decrittografare le informazioni. La chiave pubblica può essere distribuita a chiunque. Questa chiave viene utilizzata per crittografare i dati. In questo modo, chiunque può crittografare i dati utilizzando la chiave pubblica, ma solo il proprietario della chiave privata può decrittografare queste informazioni.
Un certificato è un documento elettronico che contiene informazioni sull'utente a cui appartiene il certificato, nonché la chiave pubblica. Avere un certificato consente all'utente di firmare qualsiasi dato e inviarlo al server, il quale può verificare questa firma e decrittografare i dati.
Per firmare correttamente un messaggio con un certificato, è necessario prima crearlo correttamente. A tal fine, su Rутокен si genera in primo luogo una coppia di chiavi, e poi il certificato deve essere associato alla chiave pubblica di questa coppia. Il certificato deve contenere esattamente quella chiave pubblica che si trova su Rутокен, ed è importante. Se creiamo semplicemente una coppia di chiavi e il certificato direttamente nella parte client dell'applicazione, come potrà poi il server decrittare questo messaggio criptato? Infatti, non ha alcuna informazione né sulla coppia di chiavi né sul certificato.
Se si approfondisce l'argomento, si possono trovare informazioni interessanti su internet. Esistono alcuni centri di certificazione ai quali ci fidiamo implicitamente. Questi centri possono emettere certificati agli utenti, i quali installano questi certificati sui propri server. Dopo di che, quando un cliente si rivolge a quel server, vede proprio quel certificato e nota che è stato emesso da un centro di certificazione, il che significa che si può fidare di quel server. Ci sono anche molte informazioni su internet su come configurare tutto correttamente. .
Tornando al nostro compito, la soluzione sembra ovvia. È necessario in qualche modo creare la propria autorità di certificazione. Ma prima di questo, bisogna capire su quali basi l'autorità di certificazione deve emettere un certificato per l'utente, dato che non sa nulla su di lui (ad esempio, il suo nome, cognome, ecc.). C'è una cosa chiamata richiesta di certificato. Maggiori dettagli su questo standard possono essere trovati, ad esempio, su Wikipedia
Useremo la versione 1.7 — PKCS#10.
Descriviamo l'algoritmo di generazione del certificato su Rutoken (fonte originale — ):
- Sul client creiamo una coppia di chiavi e la salviamo su Rutoken. (il salvataggio avviene automaticamente)
- Sul client creiamo la richiesta di certificato.
- Inviamo questa richiesta dal client al server.
- All'arrivo della richiesta di certificato sul server, emettiamo il certificato con la nostra autorità di certificazione.
- Inviamo questo certificato al client.
- Sul client salviamo il certificato su Rutoken.
- Il certificato deve essere associato alla coppia di chiavi creata nel primo passaggio.
Ora è chiaro come il server possa decifrare la firma del cliente, poiché esso stesso gli ha rilasciato un certificato.
Nella parte successiva, esamineremo in dettaglio come configurare la propria autorità di certificazione basata su una libreria crittografica open source completa come openSSL.
Fonte: habr.com
