Answers:
您可能无法做到这一点,至少现在还没有,或者至少在一般情况下无法这样做。但是,我将分享我所学到的知识,并期待在适当的时候更新此答案。
首先,与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_PASSPHRASE
给gpg-agent
具有相同再次$CACHEID
,它返回缓存密码,而不是使用pinentry
。
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
选择该选项,密码短语也可以清晰地显示为十六进制编码的字符串。除非您知道自己在做什么,并采取适当的预防措施,否则对此进行混搭可能是一个非常糟糕的主意。
gpg-agent
,是吗?
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
。)
在更高版本的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/
要获取缓存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的答案有效。
http://lists.gnupg.org/pipermail/gnupg-users/2010-January/037876.html
缓存ID是密钥的完整指纹。
gpg --fingerprint user@foo.bar