web-dev-qa-db-ja.com

署名したばかりのRPMの不正な署名またはNOKEYエラー

RHEL/CentOS 5ホストでRPM署名が機能するようになると、深刻な問題が発生します。

TL; DR:RPM署名が機能せず、正確なGPGキーのサイズと形式、および生成された場所によっては、さまざまな異常な方法で動作し、現在のようにrpm -qa gpg-*によってキーが表示されるとNOKEYエラーが発生します;同じマシン上で同じ鍵で署名されたばかりのRPMでのBAD署名エラー。 gpgがパスフレーズを問題なく直接受け入れるキーでの無効なパスフレーズエラー。等.


4096、2048、1024ビットのRSAキーと2048ビットのDSAキーでテストし、同じCentOS 5.10 VMで署名と検証を行いました。動作はキーのタイプとサイズによって異なりますが、実際に機能するものはまだ見つかりません。

名前、電子メール、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の検証​​コマンドはそれを認識しません。

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

...これは、少なくとも署名時の失敗であり、後ではありません。)

CentOS 5で2048または1024ビットのRSAキーを使用する場合、そのキーでRPMに署名しただけなのに、署名が検証されると、代わりにBAD署名が報告されます

$ 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)

真剣に。 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ポイントのために、パスフレーズ「fred」を使って、使い捨ての新しい鍵をCentOSボックスに直接生成しました。私はそれに署名することができます:

$ 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

そしてそれを確認します:

$ 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

しかし、rpmsignはさらに異常になっています。 とまったく同じパスフレーズを使用すると、拒否されます。

$ 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ターゲット内でmockを使用してコンパイルされたtest.rpmを使用しますモック環境(つまり、一致する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がパッケージに署名しただけで、独自の署名を拒否しました。

明らかに、ほとんどの人がこれらの問題を抱えていません。何が欠けていますか?

6
Craig Ringer

それはRPMバグのクラスターです。 1つまたは2つのバグだけではありません。生き物の巣。 RPMは署名されたパッケージの検証に失敗しました(失敗しましたか?)、v4 GPG署名を理解していませんが、それらを理解していません、いくつかのキーのサイズとタイプを理解していませんが、それを理解していません。 、そしてサブキーも詰まっています!

同僚から指摘されたJacob Helwigによるこの命を救うブログエントリは、問題をカバーしています

`でRHEL/CentOS 5または6にサインオン/サインオンするとき、GnuPGが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は署名後にsigversionをチェックしたり、署名されたパッケージを検証したりせず、これらのディストリビューションにはデフォルトでv4署名のGPGバージョンが含まれているためです。

また、サブキーのない2048ビットの署名のみのRSAキーを生成する必要があります。

いくつかの関連するバグ:

8
Craig Ringer