清理我的 gnupg 密钥环?

清理我的 gnupg 密钥环?

我的 gnupg 密钥环包含数百个不必要的条目。如何从中删除过期、撤销和未签名的密钥?

我想保留已对我的密钥进行签名的密钥,并仅在需要时导入新密钥。我之前已为我的密钥签名者导入了整个信任网。看来我的一位密钥签名者在旅途中收集了大量签名,这些签名现在堵塞了我的密钥环。

答案1

来自查尔斯·洛克哈特的GPG 备忘单

我使用User Name与密钥关联的名称。抱歉,这不太有想象力。我思考gpg 的用户分配范围很广,例如,我的私钥名称是“Charles Lockhart”,但我只需输入“Lockhart”即可引用。抱歉,这没有任何意义。

            ︙

删除公钥(从你的公钥环中):

$ gpg --delete-key "User Name"

这将从您的公钥环中删除公钥。
注意:如果您的私钥环上有与此公钥关联的私钥,您将收到错误!您必须先从您的私钥环中删除此密钥对的私钥。

删除私钥(私钥环上的密钥):

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

这将从您的密钥环中删除密钥。

答案2

gpg 的手册页建议不要解析的正常输出,--list-keys但它提供了可解析的输出--with-colons

这将删除所有已过期或已撤销的公钥:

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

它是如何工作的?

  1. 告诉 gpg 以可解析的格式输出密钥(这种格式的文档有点隐蔽:手册页说它们在doc/DETAILS在源代码中,我的发行版将它们安装在/usr/share/doc/gunpg/DETAILS
  2. 告诉 awk 使用冒号作为字段分隔符:-F:
  3. 仅选择第一个字段为“pub”的行,这些是公钥
  4. 仅选择第二个字段为“e”或“r”的行,这些是已撤销或过期的密钥
  5. 仅打印选定行的第五字段,即键 id
  6. 使用 xargs 将这些行交给 gpg 并删除它们

答案3

我有一个 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

答案4

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

这是执行该任务的 bash 脚本。它是https://superuser.com/a/859739对于 gpg2,密钥 ID 位于第二行。

相关内容