Estou tendo sérios problemas para conseguir a assinatura do RPM para os hosts do RHEL / CentOS 5.
TL; DR: A assinatura do RPM não está funcionando e está funcionando de várias maneiras insanas e erráticas, dependendo do tamanho e formato exato da chave GPG e até mesmo de onde foi gerada, produzindo erros NOKEY quando a chave é mostrada por rpm -qa gpg-*
como presente; BAD
erros de assinatura em um RPM que acabou de ser assinado na mesma máquina com a mesma chave; erros de senha inválidos em uma chave em que o gpg aceita a frase secreta diretamente sem problemas; etc.
Eu testei com chaves RSA de 4096, 2048 e 1024 bits e uma chave DSA de 2048 bits, fazendo a assinatura e a verificação na mesma VM do CentOS 5.10. O comportamento varia com o tipo e o tamanho da chave, mas ainda não encontrei nada que funcione ainda.
Com nomes, emails e nomes de arquivos RPM mascarados por XXX, mas sem outras edições, por exemplo, a chave 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
? Como isso faz algum sentido?
Eu importei a chave com rpm --import
como normal. Importou sem erros. Está listado no banco de dados do RPM. No entanto, o comando verify do RPM não o vê.
Eu vejo o mesmo problema com uma chave RSA de 4096 bits no CentOS 5.
(No Fedora 20, ele falha com:
$ 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
... que é pelo menos uma falha na hora da assinatura, não mais tarde.
Se eu usar uma chave RSA de 2048 ou 1024 bits no CentOS 5, eu recebo uma assinatura BAD relatada quando a assinatura é verificada, apesar do fato de que eu assinei o RPM com essa chave :
$ 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)
Sério. W.T.F? Estou em um nível de frustração na cabeça e encontro-me com a misericórdia da Stack Exchange. Empacotadores RPM, por favor, compartilhem seu voodoo de assinatura secreta.
Não parece ser necessário fazer com que os avisos sobre stdin sejam reabertos .
(Eu adoraria simplesmente não dar suporte ao EL5, mas estou empenhado em apoiá-lo por um pouco mais de tempo, assim como distribuições mais novas e mais saudáveis).
Outras informações relevantes:
$ 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)
Ah, e para pontos de bônus WTF, eu gerei uma nova chave descartável diretamente na caixa do CentOS, com a senha "fred". Eu posso assinar coisas com isso:
$ 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
e confirme:
$ 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
mas rpmsign está sendo ainda mais insano. Com exatamente a mesma frase secreta , ele é rejeitado:
$ rpmsign --define '%_gpg_name [email protected]' --resign test.el5.x86_64.rpm
Enter pass phrase:
Pass phrase check failed
seja digitado ou copiado & colado. Usar rpm
como wrapper em vez de rpmsign
não faz diferença.
Update : Para novos pontos loucos de bônus, no CentOS 6.5 usando uma chave DSA de 2048 bits, usando um test.rpm
que acabou de ser compilado usando mock
em um ambiente de simulação de destino do CentOS 6.5 com uma versão RPM correspondente):
$ 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
O Yup-rpmsign acabou de assinar o pacote e rejeitou sua própria assinatura.
É evidente que a maioria das pessoas não tem esses problemas. O que estou perdendo?