Cra*_*ger 6 redhat gpg rpm digital-signatures centos5
我在为 RHEL/CentOS 5 主机进行 RPM 签名时遇到了严重的问题。
TL;DR:RPM 签名不起作用,并且它以各种疯狂和不稳定的方式工作,具体取决于确切的 GPG 密钥大小和格式,甚至生成位置,当密钥显示rpm -qa gpg-*
为当前时会产生 NOKEY 错误;BAD
刚刚使用相同密钥在同一台机器上签名的 RPM 上的签名错误;密钥上的无效密码错误,其中 gpg 直接接受密码而没有问题;等等。
我已经使用 4096、2048 和 1024 位 RSA 密钥以及 2048 位 DSA 密钥进行了测试,在同一个 CentOS 5.10 虚拟机上进行签名和验证。行为因密钥类型和大小而异,但我还没有发现任何真正有效的东西。
姓名、电子邮件和 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 <XXX@XXX.com>
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 XXX@XXX.com' --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
Run Code Online (Sandbox Code Playgroud)
NOKEY
? 这有什么意义?
我rpm --import
像往常一样导入了密钥。它导入没有错误。它列在 RPM 数据库中。然而 RPM 的 verify 命令没有看到它。
我在 CentOS 5 上看到 4096 位 RSA 密钥存在同样的问题。
(在 Fedora 20 上,它反而失败了:
$ rpmsign --define '%_gpg_name XXX@XXX.com' --resign test.x86_64.rpm
Enter pass phrase:
Pass phrase is good.
test.x86_64.rpm:
error: Unsupported PGP signature
Run Code Online (Sandbox Code Playgroud)
...这至少在签名时失败了,而不是以后。)
如果我在 CentOS 5 上使用 2048 或 1024 位 RSA 密钥,我会在验证签名时收到一个 BAD 签名,尽管我刚刚使用该密钥对 RPM 进行了签名:
$ gpg --import /mnt/repo/packaging-key-secret-1024
gpg: key 1FC138CC: secret key imported
gpg: key 1FC138CC: public key "XXX <XXX@XXX.com>" imported
gpg: Total number processed: 1
gpg: imported: 1 (RSA: 1)
gpg: secret keys read: 1
gpg: secret keys imported: 1
$ gpg -a --export XXX@XXX.com > /tmp/packagers
$ sudo rpm --import /tmp/packagers
$ rpm --define '%_gpg_name XXX@XXX.com' --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)
Run Code Online (Sandbox Code Playgroud)
严重地。跆拳道?我正处于沮丧之中,并且让自己置身于 Stack Exchange 的怜悯之中。RPM 打包者,请分享您的秘密签名巫毒教。
(我很想简单地不支持 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)
Run Code Online (Sandbox Code Playgroud)
哦,对于额外的 WTF 积分,我直接在 CentOS 机器上生成了一个一次性的新密钥,密码短语为“fred”。我可以用它签名:
$ gpg -q -a -b --sign -u XXX@XXX.com testfile
You need a passphrase to unlock the secret key for
user: "XXX <XXX@XXX.com>"
1024-bit DSA key, ID 99188B9C, created 2014-08-29
Run Code Online (Sandbox Code Playgroud)
并验证它:
$ 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 <XXX@XXX.com>"
gpg: binary signature, digest algorithm SHA1
Run Code Online (Sandbox Code Playgroud)
但 rpmsign 变得更加疯狂。使用完全相同的密码,它拒绝了它:
$ rpmsign --define '%_gpg_name XXX@XXX.com' --resign test.el5.x86_64.rpm
Enter pass phrase:
Pass phrase check failed
Run Code Online (Sandbox Code Playgroud)
无论是键入还是复制粘贴。使用rpm
的包装,而不是rpmsign
直接没什么区别。
更新:对于新的奖励疯狂点,在 CentOS 6.5 上使用 2048 位 DSA 密钥,使用test.rpm
刚刚mock
在 CentOS 6.5 目标模拟环境中编译的密钥(即具有匹配的 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
Run Code Online (Sandbox Code Playgroud)
是的 - rpmsign 只是对包进行了签名,然后拒绝了它自己的签名。
显然大多数人没有这些问题。我错过了什么?
这是一组 RPM 错误。不只是一个错误,或两个错误。小动物的巢穴。RPM 无法(失败?)验证签名包,不理解 v4 GPG 签名但没有注意到它不理解它们,不理解某些密钥大小和类型但没有注意到它不理解,并且还被子键噎住了!
正如一位同事所指出的,Jacob Helwig 撰写的这篇挽救生命的博客文章涵盖了以下问题:
您必须强制 GnuPG 在您的 `
%__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}
Run Code Online (Sandbox Code Playgroud)
因为 RPM 在签名后不会检查 sigversion 或验证签名的包,并且这些发行版包含默认为 v4 签名的 GPG 版本。
您还必须生成一个没有子密钥的 2048 位仅签名 RSA 密钥。
几个相关的错误: