![如何根据一组公钥块检查 openpgp (gpg) 签名](https://linux22.com/image/32788/%E5%A6%82%E4%BD%95%E6%A0%B9%E6%8D%AE%E4%B8%80%E7%BB%84%E5%85%AC%E9%92%A5%E5%9D%97%E6%A3%80%E6%9F%A5%20openpgp%20(gpg)%20%E7%AD%BE%E5%90%8D.png)
我有一些内容需要根据预先确定的 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
(如您的示例中所示),则可以将其省略。