Nettoyer mon trousseau de clés Gnupg?

46

Mon trousseau de clés gnupg contient des centaines d'entrées inutiles. Comment puis-je supprimer les clés expirées, révoquées et non signées?

Je souhaite conserver les clés qui ont signé ma clé et importer de nouvelles clés uniquement si nécessaire. J'avais précédemment importé l'intégralité du site Web de confiance pour les signataires de ma clé. Il semblerait que l'un de mes principaux signataires ait recueilli un très grand nombre de signatures au cours de ses voyages, et celles-ci encrassent maintenant mon trousseau de clés.

scruss
la source
1
Je voudrais utiliser gpgtools.org . Cela n'aide en rien de supprimer les expirés, mais cela facilite grandement la gestion des clés de gpg
Nick Roz

Réponses:

37

De la feuille de triche GPG de Charles Lockhart :

J'ai utilisé User Namele nom associé à la clé. Désolé, ce n'est pas très imaginatif. Je pense que gpg est assez large dans ses affectations d'utilisateurs, par exemple, le nom de ma clé privée est «Charles Lockhart», mais je peux le mentionner en mettant simplement «Lockhart». Cela n'a aucun sens, désolé.

            ︙

supprimer une clé publique (de votre jeu de clés):

$ gpg --delete-key "User Name"

Cela supprime la clé publique de votre jeu de clés.
REMARQUE: S'il y a une clé privée sur votre jeu de clés associé à cette clé publique, vous obtiendrez une erreur! Vous devez d'abord supprimer votre clé privée pour cette paire de clés de votre jeu de clés privé.

supprimer une clé privée (une clé de votre jeu de clés privé):

$ gpg --delete-secret-key "User Name"

Cela supprime la clé secrète de votre jeu de clés.

MelBurslan
la source
2
Merci; c'est un début, au moins. Je peux l'utiliser pour trouver et répertorier les clés expirées:gpg --list-keys | awk '/^pub.* \[expired\: / {id=$2; sub(/^.*\//, "", id); print id}' | fmt -w 999 | sed 's/^/gpg --delete-keys /;'
scruss
"User Name"peut aussi être la clé publique courte
nmz787
8

J'ai un script bash programmé pour s'exécuter chaque semaine depuis cron pour gérer ceci:

#!/bin/bash
# Clean up the GPG Keyring.  Keep it tidy.
# blog.lavall.ee

echo -n "Expired Keys: "
for expiredKey in $(gpg2 --list-keys | awk '/^pub.* \[expired\: / {id=$2; sub(/^.*\//, "", id); print id}' | fmt -w 999 ); do
    echo -n "$expiredKey"
    gpg2 --batch --quiet --delete-keys $expiredKey >/dev/null 2>&1
    if [ $? -eq 0 ]; then
        echo -n "(OK), "
    else
        echo -n "(FAIL), "
    fi
done
echo done.

echo -n "Update Keys: "
for keyid in $(gpg -k | grep ^pub | grep -v expired: | grep -v revoked: | cut -d/ -f2 | cut -d' ' -f1); do
    echo -n "$keyid"
    gpg2 --batch --quiet --edit-key "$keyid" check clean cross-certify save quit > /dev/null 2>&1
    if [ $? -eq 0 ]; then
        echo -n "(OK), "
    else
        echo -n "(FAIL), "
    fi
done
echo done.

gpg2 --batch --quiet --refresh-keys > /dev/null 2>&1
if [ $? -eq 0 ]; then
    echo "Refresh OK"
else
     echo "Refresh FAIL."
fi
Warren Lavallee
la source
Qu'y a-t-il $2dans la awksection de votre script? Et pendant que c'est quoi $1? À votre santé.
Cbhihe
Syntaxe awk normale pour les deuxième et premier champs (séparés par des espaces) dans la ligne d'entrée actuelle.
Fche
Je ne comprends pas pourquoi faire un nettoyage local des clés et ensuite… télécharger à nouveau tous les éléments que vous venez de supprimer de keyserver --refresh-keys. Je mettrais l'actualisation au milieu du script, pas la fin.
Lapo
4
% gpg --edit-key KEYID
gpg> clean
User ID [...]: 139 signatures removed
gpg> save
% gpg --version
gpg (GnuPG) 1.4.18
[...]
fche
la source
1
Lorsque je suis ces étapes et que je vérifie ensuite avec `gpg --list-keys`, je continue à voir les mêmes anciennes clés périmées ...
Cbhihe
5
gpg cleanne supprime pas les clés expirées, uniquement les signatures expirées
fche
0
echo -n "Expired Keys: "
list_expired_keys="$(gpg2 --list-keys | grep -1 pub | sed 'N;s/\n/ /' | awk '/^pub.* \[expired\: / {id=$7; sub(/^.*\//, "", id); print id}' | fmt -w 999)";
list_revoked_keys="$(gpg2 --list-keys | grep -1 pub | sed 'N;s/\n/ /' | awk '/^pub.* \[revoked\: / {id=$7; sub(/^.*\//, "", id); print id}' | fmt -w 999)";
for key in $list_expired_keys $list_revoked_keys; do
    echo -n "$key"
    gpg2 --batch --quiet --delete-keys $key >/dev/null 2>&1
    if [ $? -eq 0 ]; then
        echo -n "(OK), "
    else
        echo -n "(FAIL), "
    fi
done
echo done.

voici un script bash faisant le travail. Il s’agit d’une adaptation de https://superuser.com/a/859739 pour gpg2 où l’identifiant de la clé figure sur la deuxième ligne.

Brian
la source