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 [email protected] È 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) <[email protected]> (2) Chloe (plebeo) <[email protected]> Comando> |
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) <[email protected]> (2) Chloe (plebeo) <[email protected]> |
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) <[email protected]> (2) Chloe (plebeo) <[email protected]> Comando> check uid Chloe (giullare) <[email protected]> sig! 26B6AAE1 1999-06-15 [autofirma] uid Chloe (plebeo) <[email protected]> sig! 26B6AAE1 1999-06-15 [autofirma] |
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) <[email protected]>" 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) <[email protected]> (2) Chloe (plebeo) <[email protected]> |
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) <[email protected]> signed by B87DBA93 at 1999-06-28 Chloe (plebeo) <[email protected]> signed by B87DBA93 at 1999-06-28 user ID: "Chloe (giullare) <[email protected]>" 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) <[email protected]>" 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) <[email protected]> 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) <[email protected]>" 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) <[email protected]> (2) Chloe (plebeo) <[email protected]> |
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) <[email protected]> sig! B87DBA93 1999-06-28 [autofirma] uid Chloe (plebeo) <[email protected]> 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.
La data di scadenza di una chiave può essere aggiornata con il comando expire dal menù di modifica delle chiavi. Se non è selezionata nessuna chiave, verrà aggiornato il tempo di scadenza della chiave primaria. Viceversa verrà aggiornata la data della chiave subordintata selezionata.
La data di scadenza di una chiave è associata all'autofirma della chiave stessa. La data viene aggiornata cancellando la vecchia autofirma e aggiungendone una nuova. Poiché gli altri corrispondenti non avranno cancellato la vecchia autofirma, essi vedranno un'ulteriore autofirma sulla chiave quando aggiorneranno la loro copia di chiave. L'ultima autofirma, però, prende la precedenza cosicché tutti i corrispondenti sapranno senza ambiguitià la data di scadenza della chiave.
[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. |