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
- Choisir `(8) RSA (set your own capabilities)`
- Ne garder que la capacité `Certify`
- Taille de clé : *4096*
- Durée de vie : 2 ans maximum
- Identité : Prénom Nom, pas d'adresse, commentaire : `born 1900-00-00 in Muche, France`
Générer les clés secondaires
gpg --expert --edit-key KEYID gpg> addkey
- Faire une clé par usage : *Encrypt*, *Signature* et *Authentification*
gpg> save
Ajouter des identités
gpg --edit-key KEYID gpg> adduid
- Ajouter des adresses emails et des identités
- Sélectionner `uid 3` puis `primary` et boucler pour mettre dans l'ordre
- Éventuellement ajouter une photo en .jpg, chemin absolu avec `addphoto`
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 Dauhs8y7oh5xrdpu9psba3i5ntk64ohouhga@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-----
----
Permaliens :