如何根据一组公钥块检查 openpgp (gpg) 签名

pro*_*jix 4 gpg

我有一些内容需要根据 OpenPGP(也是关键字:gpg)公钥的预定白名单进行检查,以获得其中之一的有效签名。

白名单是单独维护的。理想情况下,它应该是 ascii 装甲公钥块的串联,但是每个文件一个公钥的目录就可以了。由于白名单是单独维护的,我们不想使用任何 gpg 的密钥环管理功能。如果内容由我们密钥集中的密钥签名,则它通过。没有不同的信任级别,没有信任网络等。

理想情况下,我们会有一个具有如下界面的程序:

some-program KEYS_FILE CONTENT SIGFILE
Run Code Online (Sandbox Code Playgroud)

或者,使用示例参数,

some-program /etc/ourapp/ourapps_trusted_pubkeys.asc /var/lib/ourapp/newcontent.tar.gz /var/lib/ourapp/newcontent.tar.gz.asc
Run Code Online (Sandbox Code Playgroud)

使用 gpg 执行此操作的最快方法似乎是:

  • 使用临时文件作为其密钥环
  • 使用 --keyring 将 gpg 指向这个,但也给 --no-default-keyring
  • 遍历 ourapps_trusted_pubkeys.asc 中的密钥,一次导入一个
  • 再次遍历密钥,使用 gpg --import-ownertrust 将它们设置为受信任
  • 运行 gpg --verify

对于我想象的常见用例来说,这是一项巨大的努力。我错过了什么?是否存在类似于假定的 some-program(1) 的工具?

Hau*_*ing 6

程序gpgv/gpgv2用于简单的签名检查。问题是导出的密钥文件不被识别为密钥环。因此,您必须在第一步中创建一个密钥环:

cd /some/tmp/dir || exit 1
test -f pubring.gpg && { rm -f pubring.gpg || exit 1; }
gpg --no-options --no-default-keyring --keyring ./pubring.gpg \
  --secret-keyring ./secring.gpg --import /etc/ourapp/ourapps_trusted_pubkeys.asc
Run Code Online (Sandbox Code Playgroud)

现在/some/tmp/dir/pubring.gpg是一个gpgv可以使用的密钥环文件:

gpgv --keyring /some/tmp/dir/pubring.gpg \
  /var/lib/ourapp/newcontent.tar.gz.asc /var/lib/ourapp/newcontent.tar.gz
Run Code Online (Sandbox Code Playgroud)

如果数据文件路径是没有的签名路径.asc(如您的示例中所示),那么您可以将其省略。