Capitolo 3. Gestione delle chiavi

Sommario
Amministrare la propria coppia di chiavi
Convalidare le altre chiavi del proprio mazzo
Distribuire le chiavi

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.

Amministrare la propria coppia di chiavi

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.

Integrità della chiave

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.

Aggiungere e togliere componenti alle chiavi

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.

Revocare le componenti di una chiave

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.

Note

[1]

Dal testo originale signing key. Una chiave di firma è quel tipo chiave che può essere usata per apporre una firma.

[2]

Self-signing nel testo originale.