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
$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>
Run Code Online (Sandbox Code Playgroud)
原则上,您可以依次向代理询问每个可能缓存的密码,并检查输出中的OK
或ERR
。那么问题就变成了,如何生成缓存 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/
在更高版本的 gnupg(用 2.1.18 测试)上使用:
gpg --fingerprint --with-keygrip <email>
拿到钥匙扣,然后
echo "KEYINFO --no-ask <keygrip> Err Pmt Des" | gpg-connect-agent
看看它是否被缓存。
要获得 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\
归档时间: |
|
查看次数: |
21251 次 |
最近记录: |