Назад | Перейти на главную страницу

Плохие подписи или ошибки 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)

Шутки в сторону. W.T.F? Я нахожусь в отчаянии и бросаюсь на милость 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 не может (не удалось?) Проверить подписанные пакеты, не понимает подписи 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 не проверяет подпись и не проверяет подписанный пакет после его подписания, а эти дистрибутивы содержат версии GPG, которые по умолчанию используют подписи v4.

Вы также должны сгенерировать 2048-битный ключ RSA только для подписи без подключей.

Пара актуальных ошибок: