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_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
选项,密码短语也会以十六进制编码的字符串形式清晰可见。除非你知道自己在做什么,并采取适当的预防措施,否则胡乱处理这可能是一个非常糟糕的主意。
答案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\