lirpm - 如何验证已安装包的签名密钥

librpm - How to verify the signature key of an installed package

我想以编程方式检查 RPM 包是否 (1) 签名(有签名)和 (2) 用于签名的密钥是否可信。

[root]$ rpm -qi setup
Name        : setup
Signature   : RSA/SHA1, Wed 02 Oct 2013 05:15:22 AM MDT, Key ID 0946

[root]$ rpm -qi testing
Name        : testing
Signature   : (none)

我正在浏览 lirpm API,但我没有看到任何 public 方法允许对已安装的软件包进行签名验证。

# This requires a file descriptor
rpmcli.h:rpmVerifySignatures

# This also requires a file descriptor
rpmlib.h:rpmReadPackageFile

进一步挖掘我看到:

# This uses a callback `qva_showPackage` which gives (QVA_t, rpmts, Header)
rpmcli.h:rpmcliVerify

但我似乎无法从回调传入的 Header 中获取 RPM 标签 (RPMTAG_SHA1HEADER)。如果我能得到这些标签,那么调用 rpmpgp.h:pgpVerifySig 来验证签名就有意义了。

编辑:

我看到大部分签名验证工作是在静态方法 rpmchecksig.c:rpmpkgVerifySigs 中完成的,该方法只能通过 rpmcli.h:rpmVerifySignatures 获得。但是这个方法需要一个文件描述符。有没有办法从已安装的软件包中获取 FD 以便能够使用此方法?

如果通过各种 mode-specific %_vsflags* 设置启用,

RPM 将在从 rpmdb 检索时验证 header-only 签名。有关值,请参阅 /usr/lib/rpm/macros。

如果你这样做,你会看到验证,比如说,"rpm -Vvv bash"。您还可以通过更改特定的宏,在 --query(或其他)rpm 模式上启用 header-only 签名验证。

有一种方法(但不是特定调用)可以检索 header 纯文本、header-only 签名和公钥(如果您希望在 rpm 外部进行验证)。