您可以通过以下方式获取GnuPG中可解析的密钥列表:
gpg2 --list-secret-keys --with-colons
此处描述了输出的格式:http://git.gnupg.org/cgi-bin/gitweb.cgi?p=gnupg.git;a=blob_plain;f=doc/DETAILS
我想编写一个bash函数,告诉我是否有有效的加密和签名密钥。基于上面的URL,这就是我提出的:
has_valid_secret_keys() {
return "$(gpg2 --list-secret-keys --with-colons 2>/dev/null | \
awk -F: 'BEGIN { sign = 0; encrypt = 0; }
($1 ~ "sec|ssb") && ($2 ~ "[mfu]") {
if ($12 ~ "s") sign++
if ($12 ~ "e") encrypt++
}
END { print !(sign * encrypt) }')"
}
也就是说,Awk脚本匹配具有边际,完整或最终有效性的秘密密钥和秘密子密钥(字段1)(字段2),然后它根据匹配的记录维护签名和加密密钥的计数器。能力(领域12)。如果这两个计数器都为零,那么我们没有签名或加密密钥,否则我们就会得到我们想要的东西。
这在GnuPG 2.1中效果很好,但是当我在GnuPG 2.0中尝试时,功能字段似乎没有在--list-secret-keys
的输出中设置。找到输出的文档非常困难;我认为它必须在v2和v2.1之间发生变化。
是否有GnuPG版本不可知(甚至包括GnuPG 1.4,如果可能的话)这样做的方式?
编辑感谢Jens Erat的回答,我的更新(即工作!)bash功能如下:
has_valid_secret_keys() {
# Check that both valid signing and encryption (sub)keys exist
# Format described at http://git.gnupg.org/cgi-bin/gitweb.cgi?p=gnupg.git;a=blob_plain;f=doc/DETAILS
# First we find the Key IDs of secret keys and subkeys, then we
# reference these against the public keys to check their capabilities
return "$(gpg --list-secret-keys --with-colons 2>/dev/null | \
awk -F: '($1 ~ "sec|ssb") { print $5 }' | \
xargs gpg --list-keys --with-colons 2>/dev/null | \
awk -F: 'BEGIN { sign = 0; encrypt = 0; }
($1 ~ "[ps]ub") && ($2 ~ "[mfu]") {
if ($12 ~ "s") sign++
if ($12 ~ "e") encrypt++
}
END { print !(sign * encrypt) }')"
}
答案 0 :(得分:0)
您为GnuPG 2.1链接的文档副本受源代码管理,您可以查看文件的历史记录,也可以只获取GnuPG 1.4 / GnuPG 2.0分支机构的版本。
冒号输出在相当长的一段时间内没有改变(它是与GnuPG二进制文件接口可能被视为“API”的最相关部分)。功能字段应该返回您(至少)GnuPG 1.4之后的预期。
版本差异的问题是另一个问题(事实上,GnuPG 2.1的行为在这里发生了变化):GnuPG 1.4和2.0有一个单独的密钥存储区,它被合并到GnuPG 2.1的公钥存储区中。有了这个改变,一些输出改变了。 GnuPG 1.4和2.0仅列出查询公共密钥环时的功能; GnuPG 2.1在列出公钥和密钥时查询相同的密钥环,并在其输出中为两个命令提供相同的信息。
如果您需要支持GnuPG 1.4和2.0,则必须