Générer une bonne paire de clés PGP/GPG

Après lecture de pas mal de documentation, voilà ma manière de faire.

Générer la clé primaire

gpg --expert --full-gen-key

Générer les clés secondaires

gpg --expert --edit-key KEYID
gpg> addkey
gpg> save

Ajouter des identités

gpg --edit-key KEYID
gpg> adduid
gpg> save

Créer le certificat de révocation

gpg --output KEYID.revocation-certificate.asc --gen-revoke KEYID

Ne garder que les sous-clés

gpg --export --armor KEYID > KEYID.public.asc
gpg --export-secret-keys --armor KEYID > KEYID.private.asc
gpg --export-secret-subkeys --armor KEYID > KEYID.subkeys-private.asc

Pour exporter chaque sous-clé, on ajoute simplement son KEYID avec un ! à la fin : KEYID!.

gpg --delete-secret-key KEYID
gpg --import KEYID.subkeys-private.asc
gpg --list-secret-keys

Le signe # dans sec# montre que la clé primaire n’est pas dans le trousseau. N’utiliser que le fichier KEYID.subkeys-private.asc ou une sous-clé particulière (nécessite généralement deux sous-clés : Encrypt et Signature) dans Thunderbird, OpenKeyChain, etc., de telle sorte que même si un attaquant a accès à ces sous-clés, on pourra les révoquer.

Note 16/11/2023 : Thunderbird enregistre la phrase de passe de la clé privée principale, mais pas celle des sous-clés, même si l’on ajoute un mot de passe de session. Autrement dit, si l’on ne veut pas avoir à taper la phrase de passe à chaque fois que l’on envoie un email signé (c’est-à-dire tout le temps), il faut ou bien importer la clé privée complète, ou bien utiliser une saisie automatique Keepass. OpenKeyChain n’a pas ce problème avec K9 Mail puisqu’il ne signe pas les messages non-chiffrés, et qu’il permet de garder en mémoire la phrase de passe pendant un temps défini par l’utilisateur.

En cas d’urgence

gpg --import KEYID.public.asc KEYID.private.asc
gpg --edit-key KEYID

Utiliser key 2 pour sélectionner la sous-clé à révoquer puis revkey pour enfin save et republier sur le serveur.

Changer la date d’expiration

gpg --edit-key KEYID

Puis expire, save et republier sur le serveur.

Publier sur le serveur

gpg --send-keys KEYID
gpg --keyserver hkp://pgp.mit.edu:80 --send-keys KEYID

Il est également recommandé pour une première clé de la téléverser sur https://keys.openpgp.org/, de sorte de pouvoir contrôler la recherche d’identité.

Mettre en place WKD

Pour que la clé soit accessible via WKD à l’adresse https://domain.tld/.well-known/openpgpkey/hu/HASH il faut placer un fichier vide nommé policy à l’adresse https://domain.tld/.well-known/openpgpkey/policy puis :

gpg --with-wkd-hash -k me@jeandauh.fr

pub rsa4096 2015-04-12 [SC] [expire : 2017-12-31]
C508D8474655467F2E58D86A34354A80ABE928E6
uid [ inconnue] Jean Dauh <me@jeandauh.fr>
s8y7oh5xrdpu9psba3i5ntk64ohouhga@jeandauh.fr
sub rsa4096 2015-04-12 [E] [expire : 2017-12-31]
sub rsa4096 2015-04-12 [S] [expire : 2017-12-31]

Ici le hash sera s8y7oh5xrdpu9psba3i5ntk64ohouhga (la partie avant le @). Autre manière ne fonctionnant pas toujours (zbase32 pas dans les dépôts) :

echo -n yomli | openssl dgst -sha1 -binary | zbase32

Dernière manière : utiliser l’outil de Keyoxide.

Le contenu du fichier est juste la clé publique en plain text (même si la spécification exige du binaire, seul OpenPGP.js est strict là-dessus). Penser à l’exporter en version minimale (sans les signatures) :

gpg --armor --export-options export-minimal --export me@jeandauh.fr

Keyoxide exige non seulement du binaire, mais également que la première identité soit une adresse email. Pour garder la compatibilité avec Keyoxide, on devra donc placer une adresse email en principale puis :

gpg --export-options export-minimal --export me@jeandauh.fr

Après coup, on peut remettre l’identité principale telle qu’elle était dans le trousseau de clé.

Ajouter la clé à une vCard

La plupart des implémentations permettent l’ajout d’une clé avec le protocole openpgp4fpr sous le format openpgp4fpr:FINGERPRINT (doc) :

KEY:https://domain.tld/.well-known/openpgpkey/hu/HASH
KEY:OPENPGP4FPR:ABAF11C65A2970B130ABE3C479BE3E4300411886

Annonce de changement de clé

Pour un changement de clé, utiliser ce modèle dans un fichier https://domain.tld/.well-known/openpgpkey/key-change.txt :

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

This notice to inform you that my previous GPG key 0xLONGKEY
should not be used anymore and then I migrate on a new GPG key 0xLONGKEY.

Old fingerprint: FINGERPRINT
New fingerprint: FINGERPRINT

This key change is not a security measure, the old key is not compromised
and still secured at this time.

New key is as usual available:
- - on my own server: https://domain.tld/.well-known/openpgpkey/HASH
- - on my DNS: dig +short TXT domain.tld | grep "openpgp4fpr"
- - via WKD: gpg -v --auto-key-locate=clear,nodefault,wkd --locate-keys me@jeandauh.fr

This notice is signed by both keys to prove ownership of them.
-----BEGIN PGP SIGNATURE-----
pb2UNZma6RQ7Jeu5OepohQ7YcCxKFhQm/4iCkvi7FMyJTWjyEGBsF3QatbS0qaEK
FbpTYZPrGatTaK
-----END PGP SIGNATURE-----