如何找出 gpg-agent 缓存了哪些键?(比如 ssh-add -l 如何显示缓存的 ssh 密钥)

use*_*135 48 gpg gpg-agent

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

nei*_*owj 38

您可能无法做到这一点,至少现在不能,或者至少在一般情况下不能。但是,我将分享我所学到的知识,并期待在适当的时候更新此答案。

首先,与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
Run Code Online (Sandbox Code Playgroud)

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

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

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

警告:的输出GET_PASSPHRASE实际上包含clear中的密码短语。即使您不使用该--data选项,密码短语也可以清晰地显示为十六进制编码的字符串。除非您知道自己在做什么并采取适当的预防措施,否则对此进行讨论可能是一个非常糟糕的主意(tm)。


Geo*_*eye 14

在更高版本的 GnuPG(用 2.2.9 测试)上,还可以使用keyinfo --list带有gpg-connect-agent.

$ gpg-connect-agent 'keyinfo --list' /bye
S KEYINFO 866C3DE249CF81E31A3691845DBADE2809487FF5 D - - 1 P - - -
S KEYINFO 04278155E72CAE8FF1548FE161F1B8F7673824F4 D - - - P - - -
OK
Run Code Online (Sandbox Code Playgroud)

1第七列表明keygrip缓存。可以使用 检索keygrip 与其代表的密钥之间的关联gpg --list-secret-keys --with-keygrip

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


gim*_*udo 9

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

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

拿到钥匙扣,然后

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

看看它是否被缓存。


Ed *_*lle 6

要获得 cacheid,您需要提及--fingerprint两次,例如:

$ gpg --fingerprint --fingerprint ftpadmin@kernel.org
pub   1024D/517D0F0E 2000-10-10
      Key fingerprint = C75D C40A 11D7 AF88 9981  ED5B C86B A06A 517D 0F0E
uid                  Linux Kernel Archives Verification Key <ftpadmin@kernel.org>
sub   4096g/E50A8F2A 2000-10-10
      Key fingerprint = E851 4C25 10C6 0291 0D47  A008 7C8B 4360 E50A 8F2A
Run Code Online (Sandbox Code Playgroud)

在这种情况下,cacheid 将是E8514C2510C602910D47A0087C8B4360E50A8F2A.


小智 6

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

gpg-connect-agent "KEYINFO --ssh-list --ssh-fpr" /bye
Run Code Online (Sandbox Code Playgroud)

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

gpg-connect-agent "KEYINFO --ssh-list --ssh-fpr=sha1" /bye
Run Code Online (Sandbox Code Playgroud)

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