71 votes

Nettoyer mon porte-clés gnupg ?

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

Je voudrais conserver les clés qui ont signé ma clé, et n'importer de nouvelles clés que si nécessaire. J'avais précédemment importé l'ensemble du réseau de confiance des signataires de ma clé. Il semblerait que l'un des signataires de ma clé ait récupéré un très grand nombre de signatures au cours de ses voyages, et celles-ci encombrent maintenant mon trousseau de clés.

73voto

MelBurslan Points 1245

De Charles Lockhart Aide-mémoire GPG :

J'ai utilisé User Name comme étant le nom associé à la clé.  Désolé, ce n'est pas très imaginatif.  I pensez à 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 référencer en mettant simplement "Lockhart".  Cela n'a aucun sens, désolé.

pour supprimer une clé publique (de votre trousseau de clés publiques) :

$ gpg --delete-key "User Name"

Cela supprime la clé publique de votre trousseau de clés publiques.
REMARQUE : si une clé privée de votre trousseau de clés privées est associée à cette clé publique, vous obtiendrez une erreur ! Vous devez d'abord supprimer votre clé privée pour cette paire de clés de votre trousseau de clés privées.

pour supprimer une clé privée (une clé sur votre porte-clés privé) :

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

Cela supprime la clé secrète de votre porte-clés secret.

9voto

Warren Lavallee Points 101

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

#!/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

4voto

Jim Points 21
% gpg --edit-key KEYID
gpg> clean
User ID [...]: 139 signatures removed
gpg> save
% gpg --version
gpg (GnuPG) 1.4.18
[...]

4voto

Lucas Points 141

La page de manuel de gpg conseille de ne pas analyser la sortie normale de --list-keys mais il offre une sortie analysable avec --with-colons .

Cela supprime toutes les clés publiques qui sont expirées ou révoquées :

gpg --list-keys --with-colons \
  | awk -F: '$1 == "pub" && ($2 == "e" || $2 == "r") { print $5 }' \
  | xargs gpg --batch --yes --delete-keys

Comment cela fonctionne-t-il ?

  1. indique à gpg de sortir les clés dans un format analysable (les documents pour ce format sont un peu cachés : la page de manuel indique qu'ils sont dans le fichier doc/DETAILS dans la source, ma distribution les a installés dans usr/share/doc/gunpg/DETAILS )
  2. indique à awk d'utiliser les deux points comme délimiteur de champ : -F:
  3. ne sélectionner que les lignes où le premier champ est "pub", ce sont des clés publiques.
  4. ne sélectionner que les lignes où le deuxième champ est "e" ou "r", ce sont des clés révoquées ou expirées.
  5. n'imprimer que le champ cinq des lignes sélectionnées, c'est-à-dire l'identifiant clé
  6. utiliser xargs pour transmettre les lignes à gpg et les supprimer

1voto

Brian Points 11
#!/bin/bash
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 bash-script qui fait le travail. C'est une adaptation de https://superuser.com/a/859739 pour gpg2 où l'identifiant de la clé est dans la deuxième ligne.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X