librpm - 如何验证已安装软件包的签名密钥

时间:2016-08-11 17:34:34

标签: c linux redhat rpm

我想以编程方式检查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)

我浏览了librpm API,但我没有看到任何允许在已安装的软件包上进行签名验证的公共方法。

# 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才能使用此方法?

1 个答案:

答案 0 :(得分:1)

如果通过各种特定于模式的%_vsflags *设置启用,RPM将在从rpmdb检索时验证仅标头签名。有关值,请参见/ usr / lib / rpm / macros。

如果你这样做,你会看到验证,例如“rpm -Vvv bash”。您还可以通过更改特定宏来启用--query(或其他)rpm模式的仅标题签名验证。

如果您希望验证rpm的外部,有一种方法(但不是特定的调用)来检索标题明文,仅标题签名和pubkey。