Плохие подписи или ошибки NOKEY на RPM, которые я только что подписал
У меня серьезные проблемы с получением подписи RPM для хостов RHEL / CentOS 5.
TL; DR: подпись RPM не работает, и она работает различными безумными и непредсказуемыми способами в зависимости от точного размера и формата ключа GPG и даже от того, где он был сгенерирован, создавая ошибки NOKEY, когда ключ показан rpm -qa gpg-*
как подарок; 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. И все же команда проверки RPM этого не видит.
Я вижу ту же проблему с 4096-битным ключом RSA в CentOS 5.
(На 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
... что, по крайней мере, провал во время подписания, а не позже.)
Если я использую 2048 или 1024-битный ключ RSA в CentOS 5, вместо этого я получаю подпись 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)
Шутки в сторону. WTF? Я нахожусь на уровне разочарования и доверяю себе на милость 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
Yup - rpmsign только что подписал пакет, а затем отклонил свою собственную подпись.
Очевидно, что большинство людей не имеют этих проблем. Что мне не хватает?
1 ответ
Это кластер ошибок RPM. Не одна ошибка или две ошибки. Гнездо тварей. RPM не может (не удалось?) Проверить подписанные пакеты, не понимает подписи GPG v4, но не замечает, что не понимает их, не понимает некоторые размеры и типы ключей, но не замечает, что не понимает этого, а также подавился подключами!
Вы должны заставить GnuPG использовать подписи v3 при входе в / для RHEL / CentOS 5 или 6 в вашем `
%__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 и не проверяет подписанный пакет после его подписания, а эти дистрибутивы содержат версии GPG, которые по умолчанию имеют подписи v4.
Вы также должны сгенерировать 2048-битный ключ RSA только для подписи без подразделов.
Пара соответствующих ошибок: