如何找出 gpg-agent 缓存了哪些密钥? (就像 ssh-add -l 如何显示缓存的 ssh 密钥一样)

如何找出 gpg-agent 缓存了哪些密钥? (就像 ssh-add -l 如何显示缓存的 ssh 密钥一样)

ssh-add -l显示所有已添加的 ssh 密钥ssh-add ~/.ssh/id_yourkey。我如何使用 gpg 和 gpg-agent 做类似的事情,换句话说,要求它显示缓存密钥的列表?

答案1

您可能无法做到这一点,至少目前还不能,或者至少在一般情况下不能。不过,我会分享我所学到的知识,并期待在适当的时候更新这个答案。

首先,与ssh-agent实际缓存私钥的功能不同,gpg-agent它可以缓存密钥或密码。由每个客户端决定要缓存的内容,并且gpg仅用于gpg-agent缓存密码。

您可以gpg-agent使用该gpg-connect-agent实用程序进行交互。在下面的示例中,我通过 STDIN 一次传递一个命令。

$ CACHEID="ThisIsTheTrickyPart"
$ ERRSTR="Error+string+goes+here"
$ PMTSTR="Prompt"
$ DESSTR="Description+string+goes+here"
$ echo "GET_PASSPHRASE --data $CACHEID $ERRSTR $PMTSTR $DESSTR" | gpg-connect-agent
D MyPassPhrase
OK

调用gpg-connect-agent并传递此命令后,pinentry我的系统上配置的命令使用错误、提示和描述字符串来提示输入密码。在本例中,我输入了“MyPassPhrase”,这是结构化输出中返回的内容(见下图)。如果我再次使用相同的 发送GET_PASSPHRASEgpg-agent$CACHEID会返回缓存的密码而不是使用pinentry

                                 对话框的 ss

GET_PASSPHRASE还接受一个--no-ask选项,该选项将在缓存未命中时返回错误。这里我使用“NotCachedID”作为缓存 ID,并使用虚拟字符串作为gpg-agent不会使用的所需参数。

$ echo "GET_PASSPHRASE --no-ask NotCachedID Err Pmt Des" | gpg-connect-agent
ERR 67108922 No data <GPG Agent>

原则上,您可以依次向代理询问每个可能缓存的密码短语,并在输出中检查OK或。ERR那么问题来了,如何生成缓存ID呢?正如我们在上面的示例中看到的,gpg-agent它接受的缓存 ID 是自由的。事实证明,它gpg在公钥上计算指纹并使用十六进制编码的字符串表示形式作为缓存 ID,但问题是该指纹与您可以通过gpg --fingerprint --list-secret-keys.该摘要称为 keygrip(因为它仅根据原始密钥材料计算,而指纹是根据密钥材料和创建时间戳计算的)。如果您确实想继续沿着这条路走下去,您将必须找出如何为您想要检查的每个键生成正确的指纹(使用下一代 GnuPG 2.1 以及选项 ,这将很容易--with-keygrip)。

警告:的输出GET_PASSPHRASE实际上包含明文密码。即使您不选择该--data选项,密码短语也会以十六进制编码的字符串形式清晰可见。除非你知道自己在做什么,并采取适当的预防措施,否则胡乱处理这可能是一个非常糟糕的主意。

答案2

在更高版本的 GnuPG(使用 2.2.9 进行测试)上,还可以使用keyinfo --list带有 的命令列出当前由代理缓存的 keygrips gpg-connect-agent

$ gpg-connect-agent 'keyinfo --list' /bye
S KEYINFO 866C3DE249CF81E31A3691845DBADE2809487FF5 D - - 1 P - - -
S KEYINFO 04278155E72CAE8FF1548FE161F1B8F7673824F4 D - - - P - - -
OK

第七列中的1表示 keygrip 已被缓存。可以使用 检索键夹和它所代表的键之间的关联gpg --list-secret-keys --with-keygrip

来源:https://demu.red/blog/2016/06/how-to-check-if-your-gpg-key-is-in-cache/

答案3

在更高版本的 gnupg(使用 2.1.18 测试)上使用:

gpg --fingerprint --with-keygrip <email>

得到钥匙夹,然后

echo "KEYINFO --no-ask <keygrip> Err Pmt Des" | gpg-connect-agent

查看它是否被缓存。

答案4

在 Windows 中(使用 gpg4win),您可以使用以下命令列出密钥:

gpg-connect-agent "KEYINFO --ssh-list --ssh-fpr" /bye

如果您想要 SHA1 指纹,请使用:

gpg-connect-agent "KEYINFO --ssh-list --ssh-fpr=sha1" /bye

我不知道如何列出键的注释,但可以在存储的键中看到它们%APPDATA%\gnupg\private-keys-v1.d\

相关内容