Creare una Chiave PGP

Published 31 May 2021 on Andrea Feletto

Premesse

Richiami

Una chiave PGP è in realtà un insieme di chiavi completamente indipendenti tra loro. Per evitare confusione chiamerò “chiave” l’insieme di chiavi e “sottochiave” ogni singola chiave. Essendo PGP un protocollo di crittografia asimmetrica, ogni sottochiave è in realtà una coppia di chiavi dette “chiave pubblica” e “chiave privata”, da non confondere con la “chiave” di prima. È un casino, lo so. Il meccanismo non è poi così difficile: date le chiavi pubblica e privata di una sottochiave, ciò che viene criptato con una può essere decriptato solo ed esclusivamente con l’altra.

Mettiamo che Pietro voglia inviarmi un messaggio criptato. Non deve fare altro che criptare il testo con la chiave pubblica appartenente alla sottochiave dedicata alla criptazione. Per leggere il messaggio dovrò decriptarlo con la chiave privata della medesima sottochiave. Nel caso in cui volessi firmare un documento, non dovrei fare altro che criptarlo con la mia chiave privata contenuta nella sottochiave dedicata alla firma. Per verificarla, Pietro può decriptare il documento con la mia chiave pubblica.

La Chiave Primaria

Tra tutte le sottochiavi, una è la più bella, la “primaria”. Una chiave primaria non è altro che la sottochiave legata alla propria identità. Viene usata solo ed esclusivamente per “certificare” le altre sottochiavi, pertanto la sua chiave privata serve solo per apportare modifiche alle altre sottochiavi. Può quindi essere conservata offline, magari in una chiavetta USB tenuta al sicuro. La sua chiave pubblica verrà invece usata per garantire che le sottochiavi secondarie siano effettivamente legate alla stessa identità.

Con il seguente comando viene generata una chiave primaria:

$ gpg --quick-gen-key 'Andrea Feletto <andrea@andreafeletto.com>' rsa4096 cert 1y

Il primo parametro è l’identità, formata da nome, cognome e email. I primi possono essere sostituiti con un nickname, mentre l’indirizzo mail è importante in quanto diversi client email lo utilizzano per individuare la chiave appropriata. Il secondo parametro è l’algoritmo crittografico per la generazione della sottochiave. In questo caso è RSA impostato sulla massima dimensione, 4096 bits. Questo algoritmo gode della massima compatibilità, soprattutto per quanto riguarda dispositivi come yubikey. L’elevato costo computazionale è giustificato dall’importanza della chiave primaria e dal fatto che questa viene usata raramente. Il terzo parametro è l’utilizzo che, come discusso prima, deve essere quello di certificare le altre sottochiavi. L’ultimo parametro è la scadenza. Questa deve essere aggiornata periodicamente prima di ogni termine e serve a “limitare i danni” nel caso di smarrimento della chiave. Una volta eseguito il comando, gpg chiede una passphrase. Questa sarà necessaria ogniqualvolta si vorrà usare o modificare la chiave.

Per controllare di aver fatto tutto bene è sufficiente elencare le chiavi:

$ gpg --list-keys

pub   rsa4096 2021-05-27 [C] [expires: 2022-05-27]
      343173A802FA7A7CA2EE891FFC4E3DF856719568
uid           [ultimate] Andrea Feletto <andrea@andreafeletto.com>

Oltre ai parametri impostati prima, si possono osservare altre informazioni. La lunga stringa di caratteri alphanumerici è l’impronta digitale (fingerprint) della sottochiave, che servirà nei prossimi passaggi.

Il tag [ultimate] indica che abbiamo la massima fiducia dell’identità associata alla chiave, il che è ovvio in questo caso, ma non necessariamente vero per chiavi altrui.

Le Sottochiavi

Ora che abbiamo la nostra chiave PGP è ora di aggiungere le sottochiavi destinate all’uso quotidiano.

Come sottochiave dedicata alla cifratura ho deciso di usare gli stessi parametri di quella principale. L’elevata compatibilità di RSA è importante perché, a differenza della firma, non essere in grado di decifrare un messaggio vuol dire non poterlo leggere. La scadenza è anch’essa fondamentale per evitare che, in caso di smarrimento della chiave principale, altre persone mi inviino messaggi che non potrò per forza di cose leggere.

Per quanto riguarda la sottochiave per la firma, in accordo con le linee guida del kernel Linux, ho optato per l’algoritmo ed25519. Essendo la verifica della firma un processo facoltativo, ci si può concedere una minore compatibilità nel nome della velocità di calcolo. La scadenza non serve per questo utilizzo.

Di seguito i comandi per creare queste due sottochiavi:

$ gpg --quick-add-key 343173A802FA7A7CA2EE891FFC4E3DF856719568 rsa4096 encr 1y
$ gpg --quick-add-key 343173A802FA7A7CA2EE891FFC4E3DF856719568 ed25519 sign

Si noti l’impronta digitale, usata per indicare la chiave principale a cui aggiungere queste chiavi.

Facendo tutto correttamente si dovrebbe avere un risultato del genere:

$ gpg --list-keys

pub   rsa4096 2021-05-27 [C] [expires: 2022-05-27]
      343173A802FA7A7CA2EE891FFC4E3DF856719568
uid           [ultimate] Andrea Feletto <andrea@andreafeletto.com>
sub   rsa4096 2021-05-27 [E] [expires: 2022-05-27]
sub   ed25519 2021-05-27 [S]

Il Keyserver

L’ultimo passaggio è spammare il mondo intero con la propria chiave pubblica. Per farlo in modo aggraziato ed elegante è preferibile usare uno o più keyservers. Ne esistono di due tipi: quelli vecchi basati su “web of trust” e quelli nuovi basati sulla verifica dell’indirizzo email. Consiglio fortemente di usare i secondi.

Con il seguente comando la chiave viene caricata su openpgp.org:

$ gpg --export andrea@andreafeletto.com | curl -T - https://keys.openpgp.org

Key successfully uploaded. Proceed with verification here:
<link per la verifica>

Cliccando sul link si approva la pubblicazione della chiave pubblica, ma non dell’identità ad essa legata. Per confermare l’identità seguire le istruzioni indicate nella pagina web.

Nella Prossima Puntata

Nel prossimo post spiegherò come importare la chiave PGP in android, come usarla per criptare le emails e come firmare i git commits.

Fonti