清理我的 gnupg 钥匙圈?

scr*_*uss 64 linux command-line gnupg

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

我想保留已签署我的密钥的密钥,并仅在需要时导入新密钥。我之前为我的密钥签名者导入了整个信任网络。我的一位钥匙签名者似乎在他的旅行中获得了大量签名,而这些签名现在正在堵塞我的钥匙圈。

Mel*_*lan 65

来自 Charles Lockhart 的GPG 备忘单

我已用作User Name与密钥关联的名称。抱歉,这不是很有想象力。我认为gpg 在其用户分配方面相当广泛,例如,我的私钥的名称是“Charles Lockhart”,但我可以通过输入“Lockhart”来引用它。这没有任何意义,对不起。

????????????

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

$ gpg --delete-key "User Name"
Run Code Online (Sandbox Code Playgroud)

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

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

$ gpg --delete-secret-key "User Name"
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢; 至少,这是一个开始。我可以用它来查找和列出过期的密钥:`gpg --list-keys | awk '/^pub.* \[过期\: / {id=$2; sub(/^.*\//, "", id); 打印 ID}' | fmt -w 999 | sed 's/^/gpg --delete-keys /;'` (2认同)
  • `“用户名”`也可以是短公钥 (2认同)

Luc*_*cas 18

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
Run Code Online (Sandbox Code Playgroud)

它是如何工作的?

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

  • 也许用“--delete-secret-and-public-key”替换“--delete-keys”以获得所有内容。 (3认同)

小智 8

我有一个计划每周从 cron 运行的 bash 脚本来处理这个:

#!/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
Run Code Online (Sandbox Code Playgroud)