Assinaturas inválidas ou erros NOKEY em RPMs Acabei de assinar

6

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?

    
por Craig Ringer 29.08.2014 / 09:11

1 resposta

8

É um cluster de erros de RPM. Não apenas um bug ou dois erros. Um ninho das criaturas. O RPM falha (não?) Para validar pacotes assinados, não entendeu as assinaturas GP4 da v4, mas não percebeu que não as entendia, não entendia alguns tamanhos e tipos de chaves, mas não percebeu que não entendia isso e também sufocou em subchaves!

Esta entrada de blog salva-vidas por Jacob Helwig, conforme apontado por um colega aborda as questões :

Você deve forçar o GnuPG a usar as assinaturas v3 ao assinar / no RHEL / CentOS 5 ou 6 no seu '

%__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}

porque o RPM não verifica a sigversion ou não valida o pacote assinado após assiná-lo, e essas distribuições contêm versões GPG que assumem como padrão as assinaturas v4.

Você também deve gerar uma chave RSA de assinatura de 2048 bits sem subchaves.

Alguns erros relevantes:

por 29.08.2014 / 11:06