我刚刚签署的RPM上的错误签名或NOKEY错误

我正在为RHEL / CentOS 5主机获取RPM签名方面遇到严重问题。

TL; DR:RPM签名不起作用,并且它以各种疯狂和不稳定的方式工作,具体取决于确切的GPG密钥大小和格式,甚至是在何处生成,当密钥显示为rpm -qa gpg-*时产生NOKEY错误rpm -qa gpg-*目前; 刚刚在同一台机器上用相同的密钥签名的RPM上的BAD签名错误; gpg无法直接接受密码的密钥上无效的密码错误; 等等


我用4096,2048和1024位RSA密钥和一个2048位DSA密钥进行了testing,在同一个CentOS 5.10虚拟机上进行签名和validation。 行为因键的types和大小而异,但我还没有find任何实际工作的东西。

名称,电子邮件和RPM文件名由XXX屏蔽,但没有其他编辑,例如DSA 2048密钥:

 $ rpm --version RPM version 4.4.2.3 $ gpg --list-secret 92fb1e62 sec 2048D/92FB1E62 2014-08-29 [expires: 2015-08-29] uid XXX <[email protected]> ssb 2048g/2E0F0A24 2014-08-29 [expires: 2015-08-29] $ gpg -a --export 92fb1e62 > /tmp/packagers $ sudo rpm --import /tmp/packagers $ rpm -qa gpg* gpg-pubkey-92fb1e62-54001945 $ rpmsign --define '%_gpg_name [email protected]' --resign test.el5.x86_64.rpm Enter pass phrase: Pass phrase is good. test.el5.x86_64.rpm: gpg: WARNING: standard input reopened gpg: WARNING: standard input reopened $ rpm -v -K test.el5.x86_64.rpm test.el5.x86_64.rpm: Header V3 DSA signature: NOKEY, key ID 92fb1e62 Header SHA1 digest: OK (47271f9fa8ac0ce03b980ff75a37f10d3b78ee7c) MD5 digest: OK (f453985ee4331d36cb82d2c4f6009509) V3 DSA signature: NOKEY, key ID 92fb1e62 

NOKEY ? 这有什么意义呢?

我用普通的rpm --import导入了密钥。 它导入没有错误。 它在RPM DB中列出。 然而,RPM的validation命令没有看到它。

我在CentOS 5上看到了与4096位RSA密钥相同的问题。

(在Fedora 20上,它反而失败:

 $ rpmsign --define '%_gpg_name [email protected]' --resign test.x86_64.rpm Enter pass phrase: Pass phrase is good. test.x86_64.rpm: error: Unsupported PGP signature 

…至less在签约时是失败的,而不是在以后。)

如果我在CentOS 5上使用2048或1024位的RSA密钥,我会在签名validation时得到一个不良的签名,尽pipe事实上我只是用这个密钥签名了RPM

 $ gpg --import /mnt/repo/packaging-key-secret-1024 gpg: key 1FC138CC: secret key imported gpg: key 1FC138CC: public key "XXX <[email protected]>" imported gpg: Total number processed: 1 gpg: imported: 1 (RSA: 1) gpg: secret keys read: 1 gpg: secret keys imported: 1 $ gpg -a --export [email protected] > /tmp/packagers $ sudo rpm --import /tmp/packagers $ rpm --define '%_gpg_name [email protected]' --resign test.x86_64.rpm Enter pass phrase: Pass phrase is good. test.x86_64.rpm: gpg: WARNING: standard input reopened gpg: WARNING: standard input reopened $ $ rpm -v -K test.x86_64.rpm test.x86_64.rpm: Header V3 RSA/SHA1 signature: BAD, key ID 1fc138cc Header SHA1 digest: OK (1befc128ddd02a79d1b1098bc16aff4532b5af6c) V3 RSA/SHA1 signature: BAD, key ID 1fc138cc MD5 digest: OK (2aaacbe1db08a2c63c94f2f705693c7d) 

认真。 WTF? 我处于一个头脑相遇的挫折层面,并且正在抛弃Stack Exchange的仁慈。 RPM包装商,请分享你的秘密签名巫毒。

关于标准input重新打开的警告似乎没有做到 。

(我很乐意不支持EL5,但是我坚持支持它一段时间,以及更新,更明智的发行版)。

其他相关信息:

 $ gpg --version gpg (GnuPG) 1.4.5 ...blahcopyrightblah... Supported algorithms: Pubkey: RSA, RSA-E, RSA-S, ELG-E, DSA Cipher: 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH Hash: MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224 $ cat /etc/redhat-release CentOS release 5.10 (Final) 

噢,为了获得WTF积分,我直接在CentOS盒子上使用密码“fred”产生了一次性的新密钥。 我可以用它来签名:

 $ gpg -q -a -b --sign -u [email protected] testfile You need a passphrase to unlock the secret key for user: "XXX <[email protected]>" 1024-bit DSA key, ID 99188B9C, created 2014-08-29 

并validation它:

 $ gpg -v testfile.asc gpg: armor header: Version: GnuPG v1.4.5 (GNU/Linux) gpg: assuming signed data in `testfile.asc' gpg: Signature made Fri 29 Aug 2014 08:02:47 AM UTC using DSA key ID 99188B9C gpg: Good signature from "XXX <[email protected]>" gpg: binary signature, digest algorithm SHA1 

但是rmsmsign更加疯狂。 使用完全相同的密码短语拒绝它:

 $ rpmsign --define '%_gpg_name [email protected]' --resign test.el5.x86_64.rpm Enter pass phrase: Pass phrase check failed 

无论是键入还是复制粘贴。 直接使用rpm作为包装而不是rpmsign没有任何区别。

更新 :在CentOS 6.5上使用2048位DSA密钥,使用在CentOS 6.5目标模拟环境(即与RPM版本匹配)中使用mock编译的test.rpm ,获得新的红利疯狂分数:

 $ rpmsign --define '%_gpg_name 92FB1E62' --resign test.rpm Enter pass phrase: Pass phrase is good. test.rpm: $ rpm -v -K test.rpm error: skipping package test.rpm with unverifiable V4 signature 

Yup – rmsms刚签了封装,然后拒绝了自己的签名。

显然大多数人没有这些问题。 我错过了什么?

这是一组RPM错误。 不只是一个错误,或两个错误。 一群小动物。 RPM失败(失败?)来validation签名的软件包,不明白v4 GPG签名,但没有注意到它不理解他们,不明白一些关键的大小和types,但没有注意到它不明白,也窒息了子键!

正如一位同事所指出的,这个由Jacob Helwig撰写的救生博客报道涵盖了以下问题 :

您必须强制GnuPG在您的`RHEL / CentOS 5或6上签名/使用v3签名时,

 %__gpg_sign_cmd %{__gpg} \ gpg --force-v3-sigs --digest-algo=sha1 --batch --no-verbose --no-armor \ --passphrase-fd 3 --no-secmem-warning -u "%{_gpg_name}" \ -sbo %{__signature_filename} %{__plaintext_filename} 

因为RPM在签名后不检查签署的软件包或validation签名的软件包,而且这些发行版包含缺省为v4签名的GPG版本。

您还必须生成一个没有子密钥的2048位仅签名RSA密钥。

几个相关的错误:

  • RPM似乎无法find用于validation签名的(GPG)RSA密钥

  • rpm – 使用4096bit或2048bit的RSA密钥创build破损的签名