Очистить мой брелок для gnupg?

46

Мой набор ключей gnupg содержит сотни ненужных записей. Как мне удалить из него устаревшие, отозванные и неподписанные ключи?

Я хотел бы сохранить ключи, которые подписали мой ключ, и импортировать новые ключи только по мере необходимости. Ранее я импортировал всю сеть доверия для подписей моего ключа. Казалось бы, один из моих ключевых лиц, подписавших протокол, собрал очень большое количество подписей в своих путешествиях, и теперь они забивают мой брелок.

scruss
источник
1
Я бы использовал gpgtools.org . Это не помогает удалить просроченный, хотя, но определенно облегчает управление ключами gpg
Ник Роз

Ответы:

37

Из шпаргалки GPG Чарльза Локхарта :

Я использовал User Nameкак имя, связанное с ключом. Извините, это не очень оригинально. Я думаю, что у gpg достаточно широкие пользовательские назначения, например, мой личный ключ называется «Чарльз Локхарт», но я могу сослаться на это, просто вставив «Локхарт». Это не имеет никакого смысла, извините.

            ︙

чтобы удалить открытый ключ (из вашего каталога открытых ключей):

$ gpg --delete-key "User Name"

Это удалит открытый ключ из вашего кольца открытых ключей.
ПРИМЕЧАНИЕ. Если в вашем кольце секретных ключей есть закрытый ключ, связанный с этим открытым ключом, вы получите сообщение об ошибке! Вы должны сначала удалить свой закрытый ключ для этой пары ключей из своего приватного ключа.

удалить личный ключ (ключ на вашем личном кольце ключей):

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

Это удалит секретный ключ из вашего секретного набора ключей.

MelBurslan
источник
2
Благодарность; это начало, по крайней мере. Я могу использовать его, чтобы найти и перечислить просроченные ключи:gpg --list-keys | awk '/^pub.* \[expired\: / {id=$2; sub(/^.*\//, "", id); print id}' | fmt -w 999 | sed 's/^/gpg --delete-keys /;'
scruss
"User Name"также может быть короткий открытый ключ
nmz787
8

У меня есть скрипт bash, который должен запускаться еженедельно из cron, чтобы справиться с этим:

#!/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
Уоррен Лавалле
источник
Что находится $2в awkразделе вашего сценария? А пока у него что $1? Приветствия.
Cbhihe
Обычный синтаксис awk для второго и первого (разделенных пробелами) поля в текущей строке ввода.
fche
Я не понимаю, зачем делать локальную очистку ключей, а затем ... загружать все то, что вы только что снова удалили с сервера ключей --refresh-keys. Я бы поставил обновление в середину сценария, а не в конец.
Lapo
4
% gpg --edit-key KEYID
gpg> clean
User ID [...]: 139 signatures removed
gpg> save
% gpg --version
gpg (GnuPG) 1.4.18
[...]
fche
источник
1
Когда я выполняю эти шаги, а затем проверяю с помощью `gpg --list-keys`, я продолжаю посылать те же старые ключи с истекшим сроком действия ...
Cbhihe
5
gpg cleanне удаляет ключи с истекшим сроком, только подписи с истекшим сроком
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.

Вот bash-скрипт, выполняющий эту работу. Это адаптация https://superuser.com/a/859739 для gpg2, где идентификатор ключа находится во второй строке.

Брайан
источник