解析GnuPG密钥列表

时间:2017-07-27 23:17:27

标签: bash awk gnupg

您可以通过以下方式获取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) }')"
}

1 个答案:

答案 0 :(得分:0)

文档在源代码管理下

您为GnuPG 2.1链接的文档副本受源代码管理,您可以查看文件的历史记录,也可以只获取GnuPG 1.4 / GnuPG 2.0分支机构的版本。

冒号输出在相当长的一段时间内没有改变(它是与GnuPG二进制文件接口可能被视为“API”的最相关部分)。功能字段应该返回您(至少)GnuPG 1.4之后的预期。

GnuPG 2.1合并密钥钥匙

版本差异的问题是另一个问题(事实上,GnuPG 2.1的行为在这里发生了变化):GnuPG 1.4和2.0有一个单独的密钥存储区,它被合并到GnuPG 2.1的公钥存储区中。有了这个改变,一些输出改变了。 GnuPG 1.4和2.0仅列出查询公共密钥环时的功能; GnuPG 2.1在列出公钥和密钥时查询相同的密钥环,并在其输出中为两个命令提供相同的信息。

如果您需要支持GnuPG 1.4和2.0,则必须

  1. 查询密钥然后
  2. 使用公钥列表的输出进行过滤。