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

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

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

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

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

some-program KEYS_FILE CONTENT SIGFILE

或者,通过示例参数,

some-program /etc/ourapp/ourapps_trusted_pubkeys.asc /var/lib/ourapp/newcontent.tar.gz /var/lib/ourapp/newcontent.tar.gz.asc

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

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

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

答案1

程序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

现在/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

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

相关内容