Czyścisz mój brelok gnupg?

43

Mój brelok gnupg zawiera setki niepotrzebnych wpisów. Jak usunąć z niego wygasłe, odwołane i niepodpisane klucze?

Chciałbym zachować klucze, które podpisały mój klucz i importować nowe klucze tylko w razie potrzeby. Wcześniej zaimportowałem całą sieć zaufania dla sygnatariuszy mojego klucza. Wydawałoby się, że jeden z moich kluczowych sygnatariuszy zebrał bardzo dużą liczbę podpisów w swoich podróżach, które teraz zapychają mój brelok.

szum
źródło
1
Chciałbym użyć gpgtools.org . Jednak nie pomaga usunąć wygasłego, ale zdecydowanie ułatwia zarządzanie kluczami gpg
Nick Roz

Odpowiedzi:

33

Z ściągawki Charlesa Lockharta z GPG :

Użyłem User Namejako nazwy związanej z kluczem. Przepraszam, to nie jest bardzo pomysłowe. Myślę, że gpg ma dość szerokie przypisania do użytkowników, np. Nazwa mojego klucza prywatnego to „Charles Lockhart”, ale mogę się do tego odwołać po prostu wpisując „Lockhart”. To nie ma sensu, przepraszam.

            ︙

aby usunąć klucz publiczny (z klucza publicznego):

$ gpg --delete-key "User Name"

To usuwa klucz publiczny z twojego klucza publicznego.
UWAGA: Jeśli na twoim kluczu prywatnym znajduje się klucz prywatny powiązany z tym kluczem publicznym, pojawi się błąd! Najpierw musisz usunąć swój klucz prywatny dla tej pary kluczy.

aby usunąć klucz prywatny (klucz z klucza prywatnego):

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

Spowoduje to usunięcie tajnego klucza z tajnego klucza.

MelBurslan
źródło
2
Dzięki; to przynajmniej początek. Za jego pomocą mogę znaleźć i wymienić wygasłe klucze:gpg --list-keys | awk '/^pub.* \[expired\: / {id=$2; sub(/^.*\//, "", id); print id}' | fmt -w 999 | sed 's/^/gpg --delete-keys /;'
scruss
"User Name"może być także krótkim kluczem publicznym
nmz787,
8

Mam zaplanowany skrypt bash uruchamiany co tydzień z crona, aby obsłużyć to:

#!/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
źródło
Co znajduje się $2w awksekcji twojego skryptu? A skoro o tym mowa, co to jest $1? Twoje zdrowie.
Cbhihe 26.04.17
Normalna składnia awk dla drugiego i pierwszego (oddzielonego spacjami) pola w bieżącym wierszu wprowadzania.
fche
Nie rozumiem, dlaczego robię lokalne czyszczenie kluczy, a następnie… ponownie pobieram wszystkie rzeczy, które właśnie usunąłeś z serwera kluczy --refresh-keys. Odświeżę na środku scenariusza, a nie na końcu.
lapo
4
% gpg --edit-key KEYID
gpg> clean
User ID [...]: 139 signatures removed
gpg> save
% gpg --version
gpg (GnuPG) 1.4.18
[...]
fche
źródło
1
Kiedy wykonuję te kroki, a następnie sprawdzam za pomocą `gpg --list-keys`, wciąż widzę te same stare klucze, które wygasły ...
Cbhihe 26.04.17
5
gpg cleannie usuwa wygasłych kluczy, tylko wygasłe podpisy
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.

oto skrypt bash wykonujący zadanie. Jest to adaptacja https://superuser.com/a/859739 dla gpg2, gdzie identyfikator klucza znajduje się w drugiej linii.

Brian
źródło