Buongiorno! Voglio condividere la mia esperienza su questo argomento.
RUTOKEN è una soluzione hardware e software nel campo dell'autenticazione, della protezione delle informazioni e della firma elettronica. In sostanza, è una chiavetta USB che può contenere dati di autenticazione che l'utente utilizza per accedere al sistema.
In questo esempio si utilizza RUTOKEN ECP 2.0.
Per lavorare con questo RUTOKEN è necessario.
Per Windows, l'installazione di un solo driver garantisce l'installazione di tutto ciò che serve affinché il sistema operativo riconosca il tuo RUTOKEN e permetta il suo utilizzo.
È possibile interagire con RUTOKEN in vari modi. Si può accedere ad esso dalla parte server dell'applicazione o direttamente da quella client. In questo esempio verrà esaminata l'interazione con RUTOKEN dalla parte client dell'applicazione.
La parte client dell'applicazione interagisce con RUTOKEN tramite un plugin RUTOKEN. Questo è un programma che deve essere installato separatamente su ogni browser. Per Windows è sufficiente scaricare e installare il plugin, .
Tutto, ora possiamo interagire con RUTOKEN dalla parte client dell'applicazione.
In questo esempio è stata presentata l'idea di implementare un algoritmo di autorizzazione dell'utente nel sistema utilizzando lo schema di 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 ottenuto.
- 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 ottenuto con il messaggio che è stato inviato nella richiesta di autorizzazione.
- Se i messaggi sono identici, l'autorizzazione è considerata riuscita.
Nell'algoritmo sopra riportato c'è un concetto come certificato. In questo esempio è necessario comprendere una certa teoria crittografica. Su Habr ci sono .
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 è composta da due parti: una chiave privata e una chiave pubblica. La chiave privata, come suggerisce il nome, deve rimanere segreta. La utilizziamo per decrittografare le informazioni. La chiave pubblica può essere distribuita a chiunque. Questa chiave è utilizzata per crittografare i dati. In questo modo, qualsiasi utente 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. Avendo un certificato, l'utente può firmare qualsiasi dato e inviarlo al server, che può verificare questa firma e decrittografare i dati.
Per poter firmare correttamente un messaggio con un certificato, è necessario crearlo nel modo giusto. A questo scopo, su Rutoken viene prima creata una coppia di chiavi e poi il certificato deve essere associato alla chiave pubblica di questa coppia di chiavi. Il certificato deve avere precisamente quella chiave pubblica che si trova su Rutoken, questo è fondamentale. Se creiamo semplicemente una coppia di chiavi e un certificato immediatamente sulla parte client dell'applicazione, come potrà poi il server decrittografare questo messaggio crittografato? Infatti, non sa nulla né della coppia di chiavi né del certificato.
Se ci si immerge più a fondo in questo argomento, è possibile trovare informazioni interessanti su Internet. Ci sono alcuni centri di certificazione ai quali ci si affida. Questi centri di certificazione possono emettere certificati agli utenti, che installano questi certificati sul proprio server. Dopo di che, quando un cliente si rivolge a questo server, vede proprio quel certificato e vede che è stato emesso da un centro di certificazione, il che significa che ci si può fidare di questo server. Dettagli su come configurare tutto correttamente si trovano anche in abbondanza su Internet. .
Tornando alla nostra attività, la soluzione sembra ovvia. Dobbiamo in qualche modo creare la nostra autorità di certificazione. Ma prima di tutto, dobbiamo capire su quale base l'autorità di certificazione dovrebbe rilasciare un certificato all'utente, poiché non sa nulla di lui. (Ad esempio, il suo nome, cognome, ecc.) Esiste una cosa chiamata richiesta di certificato. Maggiori dettagli su questo standard possono essere trovati, ad esempio, su Wikipedia.
Utilizzeremo la versione 1.7 — PKCS#10.
Descriviamo l'algoritmo per la 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 una richiesta di certificato.
- Dal client inviamo questa richiesta al server.
- All'arrivo della richiesta di certificato sul server, rilasciamo un certificato dalla nostra autorità di certificazione.
- Invitiamo questo certificato al client.
- Sul client salviamo il certificato su Rutoken.
- Il certificato deve essere associato alla coppia di chiavi che è stata creata nel primo passaggio.
Ora è chiaro come il server possa decifrare la firma del client, poiché egli stesso gli ha rilasciato il certificato.
Nella prossima parte, esamineremo in dettaglio come configurare la propria autorità di certificazione basata su una libreria crittografica open source completa, openSSL.
Fonte: habr.com
