====== GPG ======
* [[git:gpg|Utilisation avec Git]]
* [[https://help.github.com/articles/generating-a-new-gpg-key/]]
* [[https://help.ubuntu.com/community/GnuPrivacyGuardHowto]]
* [[https://riseup.net/en/security/message-security/openpgp/best-practices]]
* [[https://riseup.net/en/security/message-security/openpgp/gpg-keys]]
* [[https://superuser.com/questions/624343/keep-gnupg-credentials-cached-for-entire-user-session]]
* [[https://net-security.fr/security/gnupg-introduction-cheat-sheet/]]
* [[https://linuxfr.org/users/gouttegd/journaux/bien-demarrer-avec-gnupg]]
* [[https://linuxfr.org/users/gouttegd/journaux/de-la-distribution-des-clefs-openpgp]]
* [[https://linuxfr.org/users/gouttegd/journaux/de-la-gestion-des-clefs-openpgp]]
* [[https://linuxfr.org/users/gouttegd/journaux/de-la-confiance-dans-le-monde-openpgp]]
* [[https://blog.chimrod.com/2021/02/sauvegarder-sa-clef-privee-gpg/|Sauvegarder sa clef privée GPG]]
* [[https://une-tasse-de.cafe/blog/yubikey/|Yubikey et GPG : sécuriser ses communications]]
* [[https://9x0rg.com/posts/tech/pgp-je-ne-chiffre-plus-les-emails/|PGP - Je ne chiffre plus les emails]]
Il est important d'exporter la variable suivante dans le shell (à placer dans ''.bashrc'', donc):
export GPG_TTY=$(tty)
L'application ''seahorse'' permet de gérer les clés GPG.
==== Créer une clé GPG ====
gpg --full-generate-key
Sélectionner //RSA and RSA//, une longueur de 4096 bits, une date d'expiration (jamais), les informations personnelles et une passphrase.
==== Lister les clés connues ====
gpg --list-keys
gpg --list-secret-keys --keyid-format LONG
Ce qui se trouve après ''rsa4096/'' est l'ID de la clé, c'est cet identifiant qui est utilisé pour manipuler la clé.
==== Afficher la clé publique ====
gpg --armor --export
''%%--%%output public-key.asc'' sauvegarde directement la clé dans un fichier.
==== Importer une clé publique ====
# depuis le serveur par défaut dans la configuration de GnuPG:
gpg --search-keys edward-fr@fsf.org
# en précisant le serveur de clés:
gpg --keyserver hkp://pool.sks-keyservers.net --search-keys edward-fr@fsf.org
# depuis un fichier:
gpg --import edward.asc
# depuis l'ID:
gpg --recv-keys DEADBEEF
# ou:
gpg --recv-keys 0xDEADBEEF
Ensuite, il faut signer la clé importée, pour la marquer comme valide:
gpg --edit-key edward-fr@fsf.org
# afficher l'empreinte:
gpg> fpr
# si l'empreinte correspond à ce qui est annoncé, on peut la signer avec notre clé:
gpg> sign
gpg> quit
Il est possible de préciser avec quelle clé signer la clé:
gpg -u ID --edit-key edward-fr@fsf.org
==== Chiffrer et déchiffrer un contenu ====
* [[https://www.gnupg.org/gph/en/manual/x110.html]]
Pour chiffrer:
gpg --output config.js.gpg --encrypt --recipient ${adresse_mail} .thelounge/config.js
L'adresse mail fournie sert à identifier la clé à utiliser pour chiffrer.
* Pour répondre par défaut oui aux questions, ajouter l'option ''%%--%%yes''.
* Pour qu'il ne pose pas de question si la clé n'est pas signée, ajouter l'option ''%%--%%trust-model always''.
Pour déchiffrer:
gpg --decrypt encrypted.asc
==== Vérifier la signature d'un fichier ====
* [[https://www.gnupg.org/gph/en/manual/x135.html]]
gpg --verify fichier.sig fichier
La clé publique utilisée pour la signature doit être dans le trousseau de GPG.
==== Ajouter une identité à une clé ====
gpg --edit-key
gpg> adduid
[...]
gpg> save
La nouvelle adresse sera marquée en confiance ultime une fois les modifications à la clé sauvegardées.
Définir une clé comme principale:
gpg --edit-key
gpg>
gpg> primary
gpg> save
==== Supprimer une clé ====
gpg --delete-keys
==== Communiquer avec un serveur de clé ====
Rafraîchir les clés connues:
gpg --refresh-keys
Publier sa clé (ou mettre à jour sa clé sur un serveur de clés):
gpg --send-keys alice@example.org
Rajouter ''%%--%%keyserver certserver.pgp.com'' pour préciser le serveur de clés à utiliser.
Quelques serveurs de clés:
* https://keyserver.pgp.com/
* http://pgp.mit.edu/
* http://keys.gnupg.net/
* https://keys.openpgp.org (''%%hkps://keys.openpgp.org%%'', serveur de clé utilisé par défaut dans les nouvelles versions de GPG packagées dans Debian)
* http://keyserver.ubuntu.com
On peut configurer le serveur par défaut dans ''~/.gnupg/gpg.conf'':
keyserver hkps://keys.openpgp.org
==== Signer des clés ===
=== Faire signer sa clé : ===
- distribuer le résultat de
gpg --fingerprint DEADBEEF
- une fois sa clé signée reçue par mail:
gpg --import key.signed.asc
# ou
gpg -d fichier.asc | gpg --import
- mettre à jour sa clé sur les serveurs de clés:
gpg --send-keys DEADBEEF
=== Signer une clé : ===
* [[https://wiki.debian.org/Keysigning]]
- importer la clé :
gpg --recv-keys DEADBEEF
- s'assurer que le fingerprint et l'identité clamée correspond à ce que dit le propriétaire de la clé
- signer la clé:
gpg --sign-key DEADBEEF
- exporter la clé signée et l'envoyer par mail à son propriétaire :
gpg --armor --output DEADBEEF.signed.asc --export DEADBEEF
Avec ''caff'' (du paquet ''signing-party''), pour facilement signer toutes les sous-clés et envoyer les mails nécessaires ([[https://wiki.debian.org/caff|page Debian]], [[http://www.xryan.net/p/258|un post de blog]]) :
caff DEADBEEF
=== Divers ===
Il est possible de voir les signatures des clés:
gpg --list-sigs
Avec les programmes fournis par le paquet ''signing-party'', il est possible de générer une liste de fingerprints prêts à imprimer:
gpg-key2latex DEADBEEF > gpg.tex
Il est possible de visualiser le graphe des signatures des clés connues localement:
gpg --list-sigs --keyid-format long | sig2dot > sigs.dot
springgraph < sigs.dot > sigs.png
==== Prolonger la validité d'une clé ====
gpg --edit-key DEADBEEF
gpg> expire
gpg> 1y
gpg> key 1
gpg> expire
gpg> 1y
gpg> save
Envoyer la clé sur les serveurs de clés.
==== Redémarrer l'agent GPG ====
gpg-connect-agent reloadagent /bye
==== Sauvegardes ====
# Sauvegarde aussi de la clé privée:
gpg -o backup.gpg --export-secret-keys alice@example.org
# Sauvegarde de toutes les clés publiques connues:
gpg -o public-keys.gpg --export
gpg --export-ownertrust > trust.txt
# tous les certificats de révocation sont dans ~/.gnupg/openpgp-revocs.d/
Restauration:
gpg --import backup.gpg
gpg --import public-keys.gpg
gpg --import-ownertrust < trust.txt
==== Installer sur MacOS ====
* [[https://alexnorell.com/post/set-up-gpg/|https://alexnorell.com/post/set-up-gpg/]]
brew install gnupg pinentry-mac
brew link gnupg
echo "pinentry-program $(which pinentry-mac)" >> ~/.gnupg/gpg-agent.conf
gpg-connect-agent reloadagent /bye
==== Forwarder l'agent GPG par SSH ====
* [[https://benjamintoll.com/2023/06/07/on-gpg-agent-forwarding/|On gpg-agent Forwarding]]
* [[https://superuser.com/questions/161973/how-can-i-forward-a-gpg-key-via-ssh-agent]]
Envoyer le trousseau de clés publiques sur la machine distante :
scp ~/.gnupg/pubring.kbx remote:.gnupg/
Trouver où sont les sockets, à la fois sur la machine locale et distante :
gpgconf --list-dirs agent-socket
Supprimer les sockets potentiellement déjà existants.
Sur la machine distante, ''gpg-agent'' ne doit pas être lancé. Pour éviter le démarrage automatique :
echo no-autostart >> "$HOME/.gnupg/gpg.conf"
Sur la machine distante, il faut ajouter une option au serveur SSH :
echo "StreamLocalBindUnlink yes" | sudo tee -a /etc/ssh/sshd_config
Se connecter en forwardant la socket :
# -R socket_distante:socket_locale
ssh -R /run/user/1000/gnupg/S.gpg-agent:/Users/philippe/.gnupg/S.gpg-agent -o "StreamLocalBindUnlink=yes" vm-debian-sid
Sur la machine distante, on peut ensuite tester :
gpg-connect-agent "KEYINFO --list" /bye
gpg --clear-sign $file_to_sign
==== Dumper le contenu d'une clé GPG ====
https://cirw.in/gpg-decoder ([[https://github.com/ConradIrwin/gpg-decoder]])