La manomissione delle chiavi è una delle principali debolezze per
quanto concerne la sicurezza della crittografia a chiave pubblica.
Uno spione potrebbe manomettere il mazzo di chiavi di un utente o
creare la chiave pubblica di qualcuno e postarla affinché altri la
scarichino e la utilizzino. Per esempio, si supponga che Chloe
voglia tenere sotto controllo i messaggi che Alice spedisce a
Blake. Potrebbe instaurare un attacco detto uomo nel
mezzo. In questo tipo di attacco Chloe crea un nuova
coppia di chiavi pubblica/privata e rimpiazza la copia della
chiave pubblica di Blake in possesso di Alice con la nuova chiave
pubblica. Successivamente si mette ad intercettare i messaggi che
Alice spedisce a Blake. Ogni messaggio intercettato viene
decriptato utilizzando la nuova chiave privata e recriptato usando
la vera chiave pubblica di Blake, spedendo poi tale messaggio a
Blake. Tutti i messaggi spediti da Alice a Blake possono ora
essere letti da Chloe.
Una buona gestione delle chiavi è cruciale se si desidera
assicurare non solo l'integrità del proprio mazzo di chiavi, ma
anche l'integrità dei mazzi di chiavi di altri utenti. Il cuore
della gestione delle chiavi presente in GnuPG è la nozione di
chiavi di firma[1]. La firma di una chiave ha due principali obiettivi:
permettere di rilevare eventuali manomissioni al proprio mazzo di
chiavi e permettere di certificare che una chiave appartenga
veramente alla persona riportata dallo User ID della chiave. Le
firme di una chiave vengono anche usate in uno schema conosciuto
come rete della fiducia, la quale estende
la certificazione delle chiavi non firmate di proprio pugno, ma da
qualcun'altro di cui ci si fida. Utenti responsabili che operano
una buona gestione delle chiavi possono vanificare le manomissioni
delle chiavi praticate come attacco contro sistemi comunicazione
sicura quali GnuPG.
Una coppia di chiavi è composta da una chiave pubblica e da una
privata. Una chiave pubblica consiste in una parte della chiave
di firma generale, una parte delle sottochiavi subordinate di
firma e cifratura e un insieme di User ID utilizzati per
associare una chiave pubblica ad una persona reale. Ogni
componente contiene delle informazioni circa se stesso. Per una
chiave tale informazioni includono l'ID della chiave, quando è
stata creata, quando scadrà, etc. Per uno User ID queste
informazioni includono il nome della persona reale che la
identifica, un commento opzionale e un indirizzo di posta
elettronica. La struttura della chiave privata è simile, tranne
per il fatto che essa contiene solo la parte privata delle
chiavi e non ci sono informazioni sullo User ID.
L'opzione a linea di comando --edit-key può venir
usata per visualizzare una coppia di chiavi. Per esempio
chloe% gpg --edit-key chloe@cyb.org
È disponibile una chiave segreta.
pub 1024D/26B6AAE1 creata il: 1999-06-15 scade: mai fiducia: -/u
sub 2048g/0CF8CB7A creata il: 1999-06-15 scade: mai
sub 1792G/08224617 creata il: 1999-06-15 scade: 2002-06-14
sub 960D/B1F423E7 creata il: 1999-06-15 scade: 2002-06-14
(1) Chloe (giullare) <chloe@cyb.org>
(2) Chloe (plebeo) <chloe@tel.net>
Comando>
|
La chiave pubblica viene visualizzata assieme ad un'indicazione
circa la disponibilità di una chiave privata. Quindi vengono
listate le informazioni disponibili per ogni componente della
chiave pubblica. La prima colonna indica il tipo di chiave. La
parola
pub sta ad indicare la chiave pubblica
principale di firma, mentre la parola
sub sta
ad indicare una chiave pubblica subordinata. La seconda colonna
indica la lunghezza della chiave in bit, il tipo e l'ID. Il
tipo può essere
D per una chiave DSA,
g per una chiave ElGamal di sola cifratura e
G per una chiave ElGamal che può essere usata
sia per cifrare che per firmare. Le date di creazione e di
scadenza sono date dalle colonne tre e quattro. Le chiavi sono
seguite dagli User ID.
Informazioni più dettagliate sulla chiave possono essere
ottenute con comandi interattivi. Il comando
toggle commuta fra le
componenti pubbliche e quelle private della coppia di chiavi se
queste sono effettivamente entrambi disponibili.
Comando> toggle
sec 1024D/26B6AAE1 creata il: 1999-06-15 scade: mai
sbb 2048g/0CF8CB7A creata il: 1999-06-15 scade: mai
sbb 1792G/08224617 creata il: 1999-06-15 scade: 2002-06-14
sbb 960D/B1F423E7 creata il: 1999-06-15 scade: 2002-06-14
(1) Chloe (giullare) <chloe@cyb.org>
(2) Chloe (plebeo) <chloe@tel.net> |
Le informazioni visualizzate sono simili a quelle fornite per la
componente pubblica. La parola
sec sta ad
indicare che la chiave è privata e di firma principale, mentre
la parola
sbb sta ad indicare che le chiavi
sono private e subordinate. Vengono listati per convenienza
anche gli User ID della chiave pubblica.
Quando si distribuisce la propria chiave pubblica, si rendono
note le componenti pubbliche della propria chiave principale e
di quelle subordinate assieme allo User ID. Distribuire
solamente questo materiale, comunque, è un rischio per la
sicurezza in quanto è possibile per un malintenzionato
manomettere la chiave. La chiave pubblica, infatti, può
essere modificata aggiungendo o sostituendo altre chiavi,
oppure aggiungendo o cambiando lo User ID. Modificando lo
User ID, un malintenzionato potrebbe cambiare l'indirizzo di
posta elettronica dello User ID reale per fare in modo che
arrivino al proprio indirizzo i messaggi dell'utente ignaro.
Cambiando anche una delle chiavi di cifratura, il
malintenzionato sarebbe perfino capace di decifrare i messaggi
a lui reindirizzati.
L'utilizzo della firma digitale rappresenta una soluzione a
questo problema. Quando delle informazioni sono firmate con
una chiave privata, la corrispondente chiave pubblica è legata
alle informazioni firmate. In altre parole, solo la
corrispondente chiave pubblica può essere usata per verificare
la firma e assicurare che quelle informazioni non siano state
modificate. Una chiave pubblica può essere protetta contro la
manomissione utilizzando la corrispondente chiave privata
principale per firmare le componenti della chiave pubblica e
lo User ID, in modo tale da legare tali componenti alla chiave
pubblica principale. Firmare le componenti della chiave
pubblica con la corrispondente chiave privata principale di
firma è un'operazione che prende il nome di
autofirma[2] e la chiave pubblica legata a degli User ID
autofirmati prende il nome di
certificato.
Per fare un esempio, si supponga che Chloe abbia due User ID e
tre sottochiavi. Le firme degli User ID possono essere
controllati con il comando check dal menù di
modifica delle chiavi.
chloe% gpg --edit-key chloe
È disponibile una chiave segreta.
pub 1024D/26B6AAE1 creata il: 1999-06-15 scade: mai fiducia: -/u
sub 2048g/0CF8CB7A creata il: 1999-06-15 scade: mai
sub 1792G/08224617 creata il: 1999-06-15 scade: 2002-06-14
sub 960D/B1F423E7 creata il: 1999-06-15 scade: 2002-06-14
(1) Chloe (giullare) <chloe@cyb.org>
(2) Chloe (plebeo) <chloe@tel.net>
Comando> check
uid Chloe (giullare) <chloe@cyb.org>
sig! 26B6AAE1 1999-06-15 [autofirma]
uid Chloe (plebeo) <chloe@tel.net>
sig! 26B6AAE1 1999-06-15 [autofirma]
|
Come ci si aspettava, la chiave di firma di ogni User ID è la
chiave di firma principale con ID
0x26B6AAE1. Le autofirme delle sottochiavi
sono presenti nella chiave pubblica, ma non vengono mostrate
dall'interfaccia di GnuPG.
Sia nuove sottochiavi che nuovi User ID possono venir aggiunti
alla propria coppia di chiavi dopo che questa è stata creata.
Uno User ID viene aggiunto usando il comando
adduid. Vengono
richiesti il nome proprio, l'indirizzo email e un commento,
proprio come se si stesse creando una coppia di chiavi
iniziali. Una sottochiave viene aggiunta usando il comando
addkey.
L'interfaccia è simile a quella utilizzata durante la
creazione di una coppia di chiavi iniziale. La sottochiave
può essere una chiave di firma DSA, una chiave di sola
cifratura ElGamal oppure una di firma e cifratura ElGamal.
Quando viene generata una sottochiave o uno User ID, questi
vengono autofirmati con la propria chiave di firma principale.
Ecco il motivo per cui è necessario fornire la passphrase
durante la generazione della chiave.
Ulteriori User ID ritornano utili quando si ha bisogno di più
d'una personalità. Per esempio si può possedere un'identità
per il proprio lavoro ed una per la propria attività politica.
I colleghi di lavoro saranno a conoscenza dello User ID di
lavoro, i colleghi di partito conosceranno quello politico.
Poiché però questi gruppi di persone non dovrebbero
sovrapporsi, ogni gruppo potrebbe non fidarsi dell'altro User
ID. Entrambi gli User ID sono quindi necessari.
Anche avere più di una sottochiave può essere utile. Gli User
ID associati alla propria chiave pubblica principale vengono
convalidati dalle persone con le quali si comunica e cambiare
la chiave primaria può quindi necessitare una
ricertificazione. Ciò potrebbe risultare difficile e
dispendioso se si comunica con molte persone. D'altro canto è
opportuno cambiare periodicamente le chiavi di cifratura. Se
infatti una chiave viene compromessa, tutti i dati criptati
con quella chiave saranno vulnerabili. Cambiando chiave
invece, solo i dati cifrati con la sola chiave compromessa
saranno rivelabili.
Le sottochiavi e gli User ID possono anche venir cancellati.
Per togliere una sottochiave o uno User ID è necessario
innanzi tutto selezionarli usando rispettivamente il comando
key oppure uid. Questi comandi
funzionano in modo alternato. Per esempio, il comando
key 2 seleziona la
seconda sottochiave, mentre invocando nuovamente il comando
key 2 la si
deseleziona. Se nessun argomento opzionale viene fornito,
tutte le sottochiavi o tutti gli User ID vengono
deselezionati. Una volta che lo User ID che si desidera
cancellare viene selezionato, il comando deluid cancella
effettivamente lo User ID dalla propria chiave. In modo
analogo, il comando delkey cancella
tutte le sottochiavi selezionati sia dalla propria chiave
pubblica che da quella privata.
Quando si amministra il proprio mazzo di chiavi locali,
cancellare delle componenti di chiavi rappresenta un buon modo
per ridurre la quantità di dati inutili presenti nelle chiavi
pubbliche di altre persone. Cancellare gli User ID e le
sottochiavi dalla propria chiave, però, non sempre è saggio in
quanto si complica la distribuzione della chiave. Per
default, infatti, quando un utente importa una chiave pubblica
aggiornata, tale chiave verrà unita alla copia vecchia
eventualmente presente nel suo mazzo di chiavi. Le componenti
della chiave nuova e di quella vecchia vengono combinate
nell'unione e questo effettivamente ripristina ogni componente
precedentemente cancellata. Per aggiornare nel modo corretto
la chiave, l'utente deve prima cancellare la vecchia copia
della chiave pubblica e poi importare la nuova versione. Ciò
obera di ulteriore lavoro le persone con le quali si comunica.
Inoltre, se si spedisce la propria chiave ad un server di
chiavi, l'unione avverrà in ogni caso e chiunque la scarichi
non vedrà mai le cancellazioni apportate. Di conseguenza, per
aggiornare la propria chiave è meglio revocarne le componenti
al posto di cancellarle.
Per revocare una sottochiave è necessario prima selezionarla.
Una volta selezionata può essere revocata con il comando
revkey. La chiave
è revocata aggiungendo una revoca autofirmata alla chiave
stessa. A differenza di quanto accade per l'opzione a linea
di comando --gen-revoke, l'effetto della
revoca di una sottochiave è immediato.
Comando> revkey
Vuoi davvero revocare questa chiave? s
Ti serve una passphrase per sbloccare la chiave segreta
dell'utente: "Chloe (giullare) <chloe@cyb.org>"
chiave DSA di 1024 bit, ID B87DBA93, creata il 1999-06-28
pub 1024D/B87DBA93 creata il: 1999-06-28 scade: mai fiducia: -/u
sub 2048g/B7934539 creata il: 1999-06-28 scade: mai
sub 1792G/4E3160AD creata il: 1999-06-29 scade: 2000-06-28
rev! la sottochiave è stata revocata il: 1999-06-29
sub 960D/E1F56448 creata il: 1999-06-29 scade: 2000-06-28
(1) Chloe (giullare) <chloe@cyb.org>
(2) Chloe (plebeo) <chloe@tel.net>
|
Uno User ID viene revocato in modo diverso. Normalmente uno
User ID raccoglie le firme che attestano che lo User ID
descrive la persona che effettivamente possiede la chiave
associata. In teoria uno User ID descrive una persona per
sempre in quanto quella persona non verrà mai cambiata. In
pratica, invece, gli elementi che compongono lo User ID, come
l'indirizzo di posta elettronica e il commento, possono
cambiare nel tempo, così da invalidare lo User ID.
Le specifiche per l'OpenPGP non supportano la revoca dello User ID,
ma in pratica ciò può essere fatto revocando l'autofirma che
accompagna lo User ID. Per i motivi di sicurezza descritti
precedentemente, gli altri
corrispondenti non si fideranno di uno User ID senza una
valida autofirma.
Una firma è revocata mediante il comando
revsig. Poiché è
possibile aver firmato un numero qualsiasi di User ID,
l'interfaccia utente richiederà di decidere per ogni firma se
essa debba essere revocata o meno.
Comando> revsig
Hai firmato questi user ID:
Chloe (giullare) <chloe@cyb.org>
signed by B87DBA93 at 1999-06-28
Chloe (plebeo) <chloe@tel.net>
signed by B87DBA93 at 1999-06-28
user ID: "Chloe (giullare) <chloe@cyb.org>"
firmata con la tua chiave B87DBA93 il 1999-06-28
Creare un certificato di revoca per questa firma? (s/N)n
user ID: "Chloe (plebeo) <chloe@tel.net>"
firmata con la tua chiave B87DBA93 il 1999-06-28
Creare un certificato di revoca per questa firma? (s/N)s
Stai per revocare queste firme:
Chloe (plebeo) <chloe@tel.net>
firmata da B87DBA93 il 1999-06-28
Creare davvero i certificati di revoca? (s/N)s
Ti serve una passphrase per sbloccare la chiave segreta
dell'utente: "Chloe (giullare) <chloe@cyb.org>"
chiave DSA di 1024 bit, ID B87DBA93, creata il 1999-06-28
pub 1024D/B87DBA93 creata il: 1999-06-28 scade: mai fiducia: -/u
sub 2048g/B7934539 creata il: 1999-06-28 scade: mai
sub 1792G/4E3160AD creata il: 1999-06-29 scade: 2000-06-28
rev! la sottochiave è stata revocata il: 1999-06-29
sub 960D/E1F56448 creata il: 1999-06-29 scade: 2000-06-28
(1) Chloe (giullare) <chloe@cyb.org>
(2) Chloe (plebeo) <chloe@tel.net>
|
Uno User ID revocato viene indicato dalla firma di revoca che
accompagna lo User ID quando vengono listate le firme degli
User ID delle chiavi.
Comando> check
uid Chloe (giullare) <chloe@cyb.org>
sig! B87DBA93 1999-06-28 [autofirma]
uid Chloe (plebeo) <chloe@tel.net>
rev! B87DBA93 1999-06-29 [revoca]
sig! B87DBA93 1999-06-28 [autofirma]
|
Revocando sia le sottochiavi che le autofirme di uno User ID
si aggiungono delle autofirme di revoca alla chiave. Poiché
le firme vengono aggiunte e nulla viene cancellato, una revoca
sarà sempre visibile agli altri quando la propria chiave
aggiornata verrà distribuita e unita con le copie precedenti.
La revoca, quindi, garantisce che chiunque avrà una copia
consistente della vostra chiave.