如何找出gpg-agent已缓存的键?(例如ssh-add -l如何显示您缓存的ssh密钥)


40

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

Answers:


32

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

首先,与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>

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

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


很棒的答案!我一直在找几天,却找不到很多。将所有内容组合在一起并以简洁明了的方式进行解释的方式!
slm

屏幕截图不是可取的,而是一些GNOME程序的拦截gpg-agent,是吗?
Hauke Laging

gpg-agent调用pinentry它配置为使用的程序的任何样式。例如见如何强制GPG要使用控制台模式的pinentry ...
neirbowj 2014年

gpg-2.1.11在Ubuntu 14.04上使用从源代码编译的代码,我无法弄清楚gpg-agent缓存ID是什么:我尝试了两个键握(主键和子键)和键指纹,如所示gpg --fingerprint --with-keygrip <user>。它们都不起作用,并且gpg-connect-agent总是报告ERR 67108922 No data <GPG Agent>GPG_TTY= gpg --decrypt <file>在尝试各种缓存ID后,我通过成功运行再次检查了代理是否仍然具有密码短语。(如果不清楚,通过取消设置GPG_TTY,只有在密码已经由缓存的情况下,解密才会成功gpg-agent。)
Matei David

2.0.14是否可以被窃听?使用上述技术,gpg-agent确实确实具有指定密钥(由keygrip标识)所需的密码,但是当我尝试使用该keygrip签名时,仍然会提示我输入密码。为什么?
Otheus

8

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

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

来获取按键,然后

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

查看是否已缓存。


5

在更高版本的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

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

要获取缓存ID,您需要提及--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

在这种情况下,cacheid为E8514C2510C602910D47A0087C8B4360E50A8F2A


这对我
有用


这对我不起作用...一--fingerprint对二--fingerprint --fingerprint都返回完全相同的输出。正如@BenCreasy所写,上述使用keygrip的答案有效。
Trey

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.