Redhat

我剛剛簽署的 RPM 上的簽名錯誤或 NOKEY 錯誤

  • August 29, 2014

我在讓 RPM 簽名為 RHEL / CentOS 5 主機工作時遇到了嚴重的問題。

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

NOKEY? 這有什麼意義?

我正常導入了密鑰rpm --import。它導入沒有錯誤。它列在 RPM DB 中。然而 RPM 的驗證命令沒有看到它。

我在 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

……這至少是在簽署時失敗,而不是稍後。)

如果我在 CentOS 5 上使用 2048 或 1024 位 RSA 密鑰,我會在驗證簽名時收到錯誤簽名報告,儘管我只是使用該密鑰簽署了 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)

嚴重地。怎麼回事?我的挫敗感是正面交鋒,我將自己置於 Stack Exchange 的憐憫之下。RPM 打包者,請分享您的秘密簽名巫毒。

這似乎與有關 stdin 被重新打開的警告無關

(我很想不支持 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 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

並驗證它:

$ 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

但是 rpmsign 更加瘋狂。使用完全相同的密碼片語拒絕它:

$ rpmsign --define '%_gpg_name XXX@XXX.com'  --resign test.el5.x86_64.rpm
Enter pass phrase: 
Pass phrase check failed

無論是打字還是複制粘貼。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

是的 - 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}

因為 RPM 在簽名後不會檢查 sigversion 或驗證簽名包,並且這些發行版包含預設為 v4 簽名的 GPG 版本。

您還必須生成不帶子密鑰的 2048 位僅簽名 RSA 密鑰。

幾個相關的錯誤:

引用自:https://serverfault.com/questions/624888