Il
termine “crittografia”
significa letteralmente "scrittura nascosta" (dal greco
κρυπτóς, nascosto,
e γραφία,
scrittura). La crittografia tratta, difatti, dei metodi per rendere
un messaggio cifrato ovvero incomprensibile alle persone non
autorizzate a leggerlo.
D'altra
parte, le situazioni nelle quali si rende necessario criptare un
documento sono molte: custodire documenti, eseguire transazioni
riservate fra persone e/o macchine, tutelare la privacy nelle
comunicazioni, etc. Spesso, anzi, in molte circostanze ci si trova ad
utilizzare la crittografia senza esserne pienamente consapevoli.
Questo
articolo si propone di illustrare, attraverso un linguaggio semplice,
i principi della crittografia, le tecniche più comunemente adottate
- si parlerà, in particolare, di crittografia simmetrica ed
asimmetrica, di firma digitale e di certificati digitali - e lo
strumento che anche Linux mette in merito a disposizione: OpenSSL.
Cenni storici
La storia della
crittografia è antica quanto l'uomo. Solo a titolo d'esempio, si
attribuisce a Caio Giulio Cesare uno dei primi cifrari
Il
cifrario di Cesare è uno dei più antichi algoritmi crittografici di
cui si abbia traccia storica. Si tratta di un cifrario a sostituzione
monoalfabetica in cui, cioè, ogni lettera del testo in chiaro è
sostituita nel testo cifrato dalla lettera che si trova un certo
numero di posizioni a seguire nell'alfabeto. Questi tipi di cifrari
sono detti anche a sostituzione o a scorrimento
a causa del loro modo di operare: la sostituzione avviene lettera per
lettera, scorrendo il testo dall'inizio alla fine. Si tramanda, in
particolare, che Cesare utilizzasse uno spostamento di 3 posizioni,
secondo il seguente schema:
Testo
in chiaro ABCDEFG…
------------------------------------
Testo
cifrato DEFGHIK…
Risale, invece,
al XVI secolo il celebre metodo di Vigenère.
Il
metodo di Vigenère si può considerare una generalizzazione del
cifrario di Cesare: invece di spostare sempre dello stesso numero di
posti la lettera da cifrare, questa viene spostata di un numero di
posti variabile. Detto numero viene determinato, come spiegato di
seguito, in base ad una parola chiave, detta “verme”, da
ripetersi per tutta la lunghezza del testo in chiaro, come nel
seguente esempio:
Testo
in chiaro: RAPPORTOIMMEDIATO
Verme: VERMEVERMEVERMEVE
-----------------------------
Testo
cifrato: MEGBSMXFUQHIUUEOS
Il
testo cifrato si ottiene spostando la lettera in chiaro di un numero
di caratteri, pari al numero ordinale (A=0, B=1, C=2, ...) della
lettera corrispondente del verme, rispettando la regola della somma
circolare secondo cui, dopo l'ultima lettera dell'alfabeto, la Z,
viene nuovamente la A (es: A+C=0+2=2=C; B+C=1+2=3=D;
Z+C=25+2=27->1=B; Z+Z=25+25=50->24=Y).
Il sistema di
Vigenère fu impropriamente ritenuto “assolutamente sicuro”
nei tre secoli successivi alla sua invenzione. Successivamente, nel
1918, Gilbert Vernam (maggiore dell'Esercito USA e tecnico presso
l'AT&T Bell) perfezionò il metodo di Vigenère proponendo l'idea
di usare chiavi segrete casuali lunghe almeno quanto il messaggio e
non riutilizzabili. Venne poi dimostrato (Claude Shannon
- La teoria della comunicazione nei sistemi
crittografici,
1949) che
quello di Vernan è l'unico metodo
crittografico che sia possibile considerare assolutamente sicuro.
Il
cifrario di Vernam è, appunto, un sistema crittografico basato sul
cifrario di Vigenère, al quale si aggiunge il requisito di una
chiave unica - non un verme ripetuto - lunga quanto il testo e non
riutilizzabile.
É
esplicativo un impiego del cifrario di Vernan nell'ambito delle
telecomunicazioni: dato un messaggio binario lungo n bit, è
sufficiente scegliere una delle 2n chiavi di lunghezza n
bit (non ancora utilizzata) e l'algoritmo di codifica di tipo XOR
(ovvero, la somma circolare binaria) per ottenere un messaggio
cifrato assolutamente sicuro.
Si
può facilmente comprendere la scomodità di distribuire - peraltro
in modo sicuro - chiavi lunghe quanto l'intero testo del messaggio,
quando lo stesso messaggio è di non piccole dimensioni. Ciò
nonostante, si ha notizia dell'uso del cifrario di Vernam durante la
prima guerra mondiale da parte dei servizi segreti: gli agenti
venivano equipaggiati di taccuini contenenti una lunga chiave per
ogni pagina, da poter strappare e gettare una volta utilizzata. Di
qui il nome di OTP, acronimo per l'inglese One Time Pad,
letteralmente blocco monouso. Il cifrario di Vernam è stato
utilizzato anche per la protezione delle comunicazioni via telefono
rosso tra Washington e Mosca durante la guerra fredda. Infine, il
cifrario trovato nel 1967 sul corpo di Che Guevara è ancora
un'applicazione del cifrario di Vernam.
Tuttavia, anche
ipotizzando di voler far uso dell'insuperabile protezione del
cifrario di Vernam, restano comunque aperti importanti problemi di
ordine pratico nel soddisfare i stringenti requisiti. Parte della
ricerca crittografica attuale è, perciò, dedicata
all'individuazione di metodi che, pur rinunciando a parte della
sicurezza offerta dal sistema di Vernam, possano, in compenso,
risultare più praticabili mediante l'uso di chiavi corte e
riutilizzabili. D'altra parte, in alcune circostanze, un sistema può
considerarsi comunque “sicuro” - anche se il suo metodo di
cifratura risulta effettivamente violabile – a patto che i tempi
per scardinare il sistema siano sufficientemente alti e le
probabilità di riuscita basse.
La crittografia simmetrica
L'idea di
cifrare un documento attraverso una chiave segreta ed un algoritmo è
stata l'unica fino a poco tempo fa e va comunemente sotto il nome di
crittografia simmetrica. Il termine “simmetrico” sta a
sottolineare che la chiave è lo strumento indispensabile sia a
cifrare, sia a de-cifrare il testo; questo in contrapposizione a
quanto avviene nella crittografia asimmetrica di cui si parlerà a
breve.
Esistono, ad
oggi, molti algoritmi di crittografia simmetrica, alcuni più
robusti, altri meno, ma, dal momento che gli algoritmi sono noti (o,
come è più corretto dire, pubblici), la forza della
crittografia simmetrica risiede interamente nella segretezza della
chiave, nella grandezza dello spazio delle chiavi, nella scelta di
una “buona” chiave e nella resistenza dell'algoritmo usato agli
attacchi di crittonalisi.
Il pregio
principale della crittografia simmetrica risiede nel fatto che i suoi
algoritmi sono computazionalmente molto veloci, specialmente se messi
a confronto con quelli della crittografia asimmetrica. Per questo
motivo, la crittografia simmetrica viene spesso preferita in
operazioni di cifratura che richiedono determinate performance in
termini di velocità.
D'altra parte,
il principale problema della crittografia simmetrica, nelle
comunicazioni, è legato alla necessità di condividere la chiave di
cifratura, la qual cosa evidentemente espone l'intero procedimento ad
elevati rischi per la sicurezza.
Crittografia simmetrica con OpenSSL
Per dare
concretezza al discorso, verrà ora mostrato come sia possibile
utilizzare la crittografia simmetrica in Linux. Allo scopo verrà
utilizzata la suite di librerie e programmi crittografici OpenSSL,
normalmente preinstallata, comunque disponibile, in quasi tutte le
distribuzioni Linux.
In generale
OpenSSL risponde alla seguente sintassi:
openssl comando [opzioni_comando] [argomenti_comando]
in particolare,
per crittografare simmetricamente un documento con OpenSSL, si usa il
comando enc come mostrato di
seguito:
openssl enc – algoritmo -in file_input -out file_output
dove l'algoritmo
è uno fra quelli elencati mediante l'istruzione:
openssl list-cipher-commands
Fra gli algoritmi più robusti, sono bf (blow-fish) e des3 (triple DES).
Solo dopo aver
scelto e confermato una password, verrà generato il file cifrato in
output (aprendolo, ci si renderà conto che è assolutamente
illegibile).
Viceversa, per
decriptare un documento precedentemente cifrato, il comando enc
andrà completato con l' opzione d come illustrato di seguito:
openssl enc -d – algoritmo -in file_criptato -out file_in_chiaro
Se, poi, si desidera semplicemente mostrare a video il file in chiaro, questa è l'istruzione:
openssl enc -d – algoritmo -in file_criptato
In entrambi i casi verrà richiesta l'immissione della stessa password già utilizzata per la cifratura.
É,
tuttavia, necessaria una precisazione. Si potrebbe, difatti, ritenere
che la password sia la chiave
di cifratura, ma questo non è vero. Difatti, la chiave di cifratura
viene generata run-time sulla base dell'algoritmo scelto e
della password fornita dall'utente: si tratta di un codice binario di
lunghezza variabile a seconda dell'algoritmo adottato (es. 128 bit
con l'algoritmo Blow-Fish; 192 bit con Triple DES). Per
visualizzare una possibile chiave di cifratura, a fronte di un
algoritmo e di una password, basta eseguire:
openssl enc -P -algoritmo
In realtà, oltre alla chiave (key), verranno visualizzati, in formato esadecimale, altri due codici: il vettore di inizializzazione (iv, anch'esso generato sul momento ed utilizzato dall'algoritmo di cifratura) e il sale (salt, parametro casuale, che consente la creazione di chiavi, per l'appunto, casuali). Ovviamente, è possibile criptare un documento mediante OpenSSL anche imponendo uno o più dei precedenti parametri.
La crittografia asimmetrica
La
crittografia asimmetrica nasce con l'intento di risolvere il
problema, lasciato aperto dalla crittografia simmetrica, della
necessità di distribuire, assieme al messaggio, la chiave per
decifrare il messaggio stesso.
La
novità introdotta dalla crittografia asimmetrica è semplice e
rivoluzionaria al tempo stesso. Si fonda sull'idea che debbano
esistere due chiavi per ogni attore coinvolto nella comunicazione:
una chiave, disponibile a tutti, per cifrare i messaggi e l'altra,
assolutamente riservata, per decifrarli.
Il
principio è descritto in modo efficace dall'immagine seguente:
se
B vuole ricevere un messaggio riservato da A, B manda a A una scatola
vuota dotata di lucchetto aperto e privo di chiavi; A mette nella
scatola il messaggio, chiude la scatola col lucchetto, e reinvia il
tutto a B. B, unico possessore delle chiavi in grado di aprire il
lucchetto, sarà anche l'unico a poter ora leggere il messaggio;
Si noti come
chiunque veda passare la
scatola, non può approfittarne, o perché sprovvisto delle chiavi
per aprirla, o perchè la scatola è vuota.
La crittografia
asimmetrica, anche nota come crittografia a coppia di
chiavi, o crittografia a chiave pubblica/privata o
semplicemente crittografia a chiave pubblica, è un tipo di
crittografia dove, come si evince dal nome, ad ogni attore coinvolto
nella comunicazione è associata una coppia di chiavi:
- la chiave pubblica, che deve essere distribuita e serve a cifrare un documento destinato alla persona che possiede la relativa chiave privata.
- la chiave privata, personale e segreta, utilizzata per decodificare un documento cifrato con la chiave pubblica;
Nell'esempio
precedente in cui A spedisce un documento cifrato a B, sia A sia B
posseggono una propria chiave privata e la chiave pubblica
dell'altro: A dovrà cifrare il documento con la chiave pubblica di B
e ad inviarlo a B; B sarà l'unico a poter decodificare il documento
ricevuto con la sua chiave privata (in
altri termini, a chiunque è consentito cifrare messaggi con la mia
chiave pubblica, ma solo io sono in grado di aprire detti messaggi;
come conseguenza, se qualcuno vuole inviarmi messaggi riservati, deve
farlo cifrandoli con la mia chiave pubblica: io, d'altra parte, sarò
l'unico a poterli leggere attraverso la mia chiave privata, il che mi
mette al riparo da qualunque intercettazione).
La coppia di chiavi pubblica/privata, essendo generate attraverso lo stesso algoritmo (tipicamente RSA o DSA, a partire da numeri casuali) sono intimamente legate. Tuttavia, gli algoritmi asimmetrici sono concepiti in modo tale che la conoscenza della chiave pubblica e/o dell'algoritmo non siano sufficienti per risalire alla chiave privata: tale meccanismo è reso possibile grazie all'uso di funzioni unidirezionali. In realtà, in molti casi, l'impossibilità di risalire dalla chiave pubblica alla chiave privata non è dimostrata matematicamente, ma risulta dal limitato stato attuale delle conoscenze e della potenza di calcolo disponibile.
Per
fare un esempio, si rifletta sul fatto che è sufficiente un piccolo
computer e qualche millesimo di secondo per moltiplicare due numeri
primi da 150 cifre, ma occorre il lavoro di decine di migliaia di
computer per circa un anno per risalire ai fattori primi di quel
numero. É questo il principio su cui si fonda, ad esempio, uno dei
più diffusi algoritmi di crittografia asimmetrica: RSA (dal
nome dei suoi tre ideatori Rivest, Shamir e Adleman).
Ogni
utilizzatore, quindi, crea la propria coppia di chiavi. La chiave
privata viene tenuta segreta e non viene mai rivelata a nessuno;
viceversa, la chiave pubblica viene diffusa in vari modi: può
essere, ad esempio, aggiunta automaticamente in coda al proprio
messaggio, o può essere depositata in archivi pubblici (key
server) a disposizione di chi desideri utilizzarla. È importante
che la chiave pubblica sia liberamente accessibile, perché chiunque
voglia comunicare con la persona che l'ha generata dovrà
preventivamente munirsi di questa, e con questa cifrare il messaggio.
Riprendendo
l'esempio precedente, si immagini che A debba spedire un messaggio
riservato a B. Verranno svolti i seguenti passi:
- B sceglie due numeri primi molto grandi, ad esempio 300 cifre, e li moltiplica (impiegando meno di un secondo).
- B invia il numero che ha ottenuto ad A. Chiunque può vedere questo numero. Il numero è, difatti, la chiave pubblica.
- A usa la chiave pubblica per cifrare il messaggio.
- A manda il messaggio cifrato a B: chiunque può vederlo, ma non decifrarlo.
- B riceve il messaggio e utilizzando i due fattori primi, che solo lui conosce, ovvero la sua chiave privata, lo decifra.
A
e B impiegano pochi secondi a cifrare e decifrare, ma chiunque
intercettasse le loro comunicazioni impiegherebbe troppo tempo per
scoprire i due fattori primi con cui decifrare il messaggio.
Nonostante gli indiscussi vantaggi, la crittografia asimmetrica lascia aperti una serie di problemi.
Difatti, la
crittografia asimmetrica incontra un forte limite nel fatto che,
spesso, i relativi algoritmi di decodifica sono relativamente lenti,
soprattutto se messi a confronto con quelli della crittografia
simmetrica. Nella pratica, difatti, la crittografia simmetrica
risulta più semplice e veloce di quella asimmetrica, anche se, come
visto, necessita che innanzitutto venga condivisa la chiave in modo
sicuro. Una soluzione che consente di beneficiare contemporaneamente
della sicurezza della crittografia asimmetrica e della praticità
della crittografia simmetrica prevede di usare la crittografia
asimmetrica per scambiare, in maniera sicura, la chiave con la quale,
poi, si procederà alla comunicazione con crittografia simmetrica.
Questo, è, ad esempio, quanto accade nei protocolli di rete
crittografici quali SSL/TLS e Ipsec.
Altro importante
limite è legato all'affidabilità della comunicazione: chi
garantisce che quello con cui sto scambiando chiavi ed informazioni
sia proprio colui con cui desidero interagire e non un impostore? Il
problema è noto col titolo di man in the middle,
come spiegato nell'esempio seguente:
Si
supponga che Alice voglia comunicare con Bob, e che Giacomo voglia
spiare la conversazione, e se possibile consegnare a Bob dei falsi
messaggi. Per iniziare, Alice deve chiedere a Bob la sua chiave
pubblica. Se Bob invia la sua chiave pubblica ad Alice, ma Giacomo è
in grado di intercettarla, può iniziare un attacco man in the
middle. Giacomo può semplicemente inviare ad Alice una chiave
pubblica della quale possiede la corrispondente chiave privata. Alice
poi, credendo che questa sia la chiave pubblica di Bob, cifra i suoi
messaggi con la chiave di Giacomo ed invia i suoi messaggi cifrati a
Bob. Giacomo quindi li intercetta, li decifra, ne tiene una copia per
sè, e li re-cifra (dopo averli alterati se lo desidera) usando la
chiave pubblica che Bob aveva originariamente inviato ad Alice.
Quando Bob riceverà il messaggio cifrato, crederà che questo
provenga direttamente da Alice. Un simile attacco è possibile, in
teoria, verso qualsiasi messaggio inviato usando tecnologia a chiave
pubblica, compresi pacchetti di dati trasportati su reti di computer.
In
altri termini, non si può aver garanzia assoluta del fatto che la
chiave pubblica (ad esempio una chiave presente sul key server)
appartenga davvero alla persona nominata nell'intestazione della
chiave stessa. Il problema, come sarà chiaro a breve, apre la strada
ai certificati elettronici ed alle PKI.
Crittografia asimmetrica con OpenSSL
Verrà
ora mostrato come sia possibile utilizzare la crittografia
asimmetrica con Linux. Ci si servirà ancora di OpenSSL e
dell'algoritmo di cifratura RSA.
Come
prima cosa, sarà necessario generare una chiave privata ed una
chiave pubblica. Il comando
openssl genrsa -out nome_file numero_bit
crea la chiave privata della lunghezza specificata da numero_bit (se omesso, la lunghezza di default è pari a 512 bit). La chiave pubblica (sorpresa!...) è contenuta all'interno di quella privata ed è facilmente ricavabile mediante l'istruzione seguente (il parametro pubout indica che il file prodotto in output contiene la chiave pubblica):
openssl rsa -in file_input -out file_out -pubout
Si crei adesso un file, sia msg.txt, contenete un testo qualsiasi e si provi a cifrarlo con la chiave pubblica appena generata, come mostrato di seguito (il parametro pubin sta ad indicare che la chiave passata è pubblica).
openssl rsautl -in msg.txt -out file_output -inkey file_chiave -pubin -encrypt
Infine, simulando di essere il destinatario del messaggio cifrato, decifrarlo con la chiave privata mediante il comando:
openssl rsautl -in file_input -inkey file_chiave -decrypt
In alternativa, volendo solo visualizzare a video il contenuto del messaggio, digitare
openssl rsautl -in file_input -inkey file_chiave -decrypt
La firma digitale
Un altro ambito
in cui la crittografia (asimmetrica) si dimostra particolarmente
utile è quello della firma digitale. In questo caso, non è tanto il
contenuto del documento a dover essere tutelato, quanto l'autenticità
e l'integrità dello stesso. La firma digitale di un documento
elettronico, difatti, si propone di soddisfare i tre seguenti
requisiti:
- Autenticità: il destinatario potrà verificare l'identità del mittente;
- Non ripudio: il mittente non potrà disconoscere un documento da lui firmato;
- Integrità: sarà sempre possibile verificare se il documento è stato modificato nel trasporto.
In altri
termini, la firma digitale svolge, nei confronti dei documenti
elettronici, lo stesso ruolo che la firma autografa riveste nei
confronti dei documenti tradizionali.
Per comprendere
il meccanismo che sta alla base della firma digitale, è però prima
necessario introdurre gli algoritmi di hash.
Dal punto di
vista teorico con Hash (dall'inglese
sminuzzare,
ingarbugliare)
si intende la famiglia di algoritmi che soddisfa i seguenti
requisiti:
- un algoritmo di hash riceve in input un flusso di bit di qualsiasi dimensione e restituisce in output una stringa (composta di numeri e lettere) di dimensione fissa.
- la stringa prodotta da un algoritmo di hash è univoca, ovvero ad input uguali corrispondono output uguali e non esistono due input distinti in grado di produrre lo stesso output.
- un algoritmo di hash non è invertibile, ossia non è possibile ricostruire il documento originale a partire dalla stringa che viene restituita in output, ovvero la funzione implementata è unidirezionale.
Nella pratica,
un algoritmo di hash, a fronte di un documento elettronico di
dimensione variabile, produce un codice di dimensioni fissa
(tipicamente 128 o 160 bit) che identifica univocamente il documento
stesso. Il codice prodotto da un algoritmo di hash viene anche detto
impronta digitale del documento,
o message digest,
ad indicare qualcosa di piccolo, ma, allo stesso tempo, univocamente
rappresentativo del documento stesso come, appunto, un'impronta
digitale.
Tornando, ora,
alla firma digitale, si supponga che A voglia spedire un proprio
documento a B: come già detto, si dovrà poter dare evidenza del
fatto che il documento è stato prodotto esattamente da A (e non da
altri) e che arrivi a B non modificato. Assunto come ipotesi che,
esattamente come nella
crittografia asimmetrica, A e B dispongano ciascuno della propria
chiave privata e della chiave pubblica dell'altro, il
procedimento si può riassumere nei seguenti passi:
- Dopo aver redatto il documento, A ne calcola l'impronta digitale mediante un algoritmo di hash.
- A, usando la sua chiave privata, cifra l'impronta digitale appena ricavata. Il risultato di tale operazione è la firma digitale del documento. La firma viene allegata al documento (eventualmente assieme alla chiave pubblica di A) ed il tutto viene inviato a B.
- B, una volta ricevuto il documento, decodifica la firma digitale attraverso la chiave pubblica di A, ottenendo quindi l'impronta digitale del documento.
- B applica, ora, la stessa funzione di hash al documento e verifica che l'impronta digitale ottenuta sia la stessa di quella ricevuta: solamente se c'è coincidenza fra le impronte, B potrà essere sicuro che il documento non è stato modificato (viceversa non coinciderebbero le impronte) e che il mittente è esattamente A (viceversa, attraverso la chiave pubblica di A, B avrebbe ottenuto un'altra impronta digitale).
Usare la firma digitale con OpenSSL
Per avere
evidenza del funzionamento di un algoritmo di hash, si prenda un
qualunque documento, possibilmente di grandi dimensioni, sia
document1, e si esegua la seguente istruzione (SHA sta per
Secure Hash Algorithm)
openssl sha1 document1
Si otterrà qualcosa del tipo
SHA1(document1)=
a000757d3e917f73345a076573c37b907e34e3df
che
è la “piccola” impronta digitale di document1. Si provi
ora a modificare, anche minimamente, document1 (potrebbe
trattarsi del cambio di una lettera, di un numero o semplicemente di
un segno di interpunzione) e si provi a calcolare nuovamente
l'impronta digitale. Si rimarrà stupiti nel constatare che, per
quanto minima possa essere stata la modifica apportata al documento
originale, l'impronta digitale risulterà ora completamente
differente, anche se ancora della medesima lunghezza.
Passando
ora ad esaminare nella pratica la firma digitale, si generino (vd.
crittografia asimmetrica) attraverso RSA le due chiavi privata e
pubblica, siano private_key.txt e public_key.txt.
Per
ottenere la firma digitale di document1 nel file
document1_signature, è sufficiente la seguente istruzione
openssl dgst -sha1 -sign private_key.txt -out document1_signature documento1
Il file document1_signature prodotto risulterà, ovviamente, illegibile.
Il
destinatario di document1, per verificarne l'autenticità,
dovrà viceversa eseguire:
openssl dgst -sha1 -verify public_key.txt -signature document1_signature document1
Se tutto è andato a buon fine, riceverà il messaggio
Verified OK
a
conferma del fatto che il messaggio è autentico ed integro;
viceversa, il destinatario verrà avvertito da un messaggio d'errore.
Infrastrutture a chiave pubblica (PKI)
Parlando di
crittografia asimmetrica, si è visto (man in the middle) che
uno dei principali problemi è legato alla verifica dell'autenticità
delle chiavi pubbliche. In altri termini, come garantire che una
certa chiave pubblica, disponibile ad esempio su qualche key server,
sia effettivamente dell'ente, sito o persona al quale dichiara di
appartenere? Evidentemente, senza questa sicurezza iniziale, non è
possibile assicurare la riservatezza della comunicazione. La
questione, in alcuni contesti, diviene della massima importanza ed
attualità: si pensi, ad esempio, ad una transazione bancaria via
web.
Bene,
esattamente come avviene in altri ambiti della vita quotidiana, per
garantire la corrispondenza fra chiavi pubbliche e persone (o enti o
siti o sistemi) sono stati costituiti nel mondo appositi enti
certificatori o Certification Authority (CA). Così, chiunque
abbia necessità di esibire l'autenticità della propria chiave
pubblica, potrà rivolgersi ad una delle suddette CA. La CA, a sua
volta, solo dopo aver condotto scrupolosi controlli (comunque dietro
compenso) potrà certificare la suddetta corrispondenza tramite
l'emissione di un certificato digitale. Questa soluzione al
problema del riconoscimento affidabile delle chiavi altrui prende il
nome di Public Key Infrastructure (PKI).
Un certificato
digitale è, in particolare, un file - firmato digitalmente da una
Certification Authority - che contiene una collezione di informazioni
(secondo lo standard ITU-U X.509):
- identità della persona o del sistema (a seconda che si tratti di certificato di persona o certificato server ): nome e codice fiscale del proprietario della chiave, identificativo del sito o del servizio, organizzazione, etc,
- ente certificatore: la CA che ha rilasciato il certificato,
- periodo di validità: un certificato ha, difatti, validità limitata nel tempo,
- chiave pubblica: da utilizzare per cifrare i documenti da inviare.
In
realtà, spesso senza rendercene conto, tutti facciamo esperienza dei
certificati digitali durante la navigazione in internet. Questo
avviene comunemente quando ci colleghiamo ad un sito in modalità
sicura, ad esempio attraverso il protocollo https.
In questi casi, difatti, il nostro browser, prima di iniziare lo
scambio di dati col server, verifica di essere in possesso del
relativo certificato e, solo se la verifica restituisce esito
positivo, procede alla transazione, altrimenti, interrompe la
comunicazione e chiede autorizzazione a procedere. A riprova di
quanto detto, scorrendo le impostazioni di un qualunque browser, si
troverà, fra le altre, la lista dei certificati già registrati e
delle relative authority certificatrici.
É legittima, a questo punto, una domanda: chi certifica gli enti certificatori? La risposta non è univoca dal momento che un ente certificatore può autocertificarsi o può essere, a sua volta, certificato da altro CA. Sta di fatto che, se l'authority B viene certificata dall'authority A, tutti i certificati di B vengono ritenuti validi come se fossero stati certificati direttamente da A ed il certificato prodotto riporterà al proprio interno l'intera catena degli enti certificatori.
Verifica di certificati con OpenSSL
Ancora una volta
si utilizzerà OpenSSL, questa volta per verificare un certificato
digitale.
Si esegua,
quindi, l'istruzione
openssl s_client -connect www.google.com:443
per collegarsi alla home page di Google, tramite protocollo HTTPS, via OpenSSL. Si otterrà, fra gli altri, un messaggio del tipo:
verify
error:num=20:unable to get local issuer certificate
che sta indicare
la mancanza di un certificato a garanzia della sicurezza della
connessione.
Si punti,
adesso, allo stesso indirizzo, ma col proprio browser: la
comunicazione, questa volta, avviene senza particolari problemi dal
momento che il browser contiene al proprio interno il certificato già
citato. Supponendo di utilizzare un browser come firefox (procedure
analoghe valgono per altri tipi browser), si faccia click nella zona
azzurra sulla barra degli indirizzi: un pop-up avverte che si sta
utilizzando una connessione criptata; si segua quindi more
information... → Security → View Certificate →
Details → Export... e si salvi in locale copia dello
stesso certificato.
Tornando
nuovamente ad OpenSSL, si esegua questa volta
openssl s_client -connect www.google.com:443 -CAfile file_certificato
Si noterà che la transazione va ora a buon fine.
Commenti
Posta un commento