Não foi possível encontrar a exportação do Reprepro

13

Nós temos um repositório debian privado que foi configurado anos atrás por um administrador de sistema anterior. Os pacotes foram assinados pela chave mais antiga, 7610DDDE (que eu precisei revogar), conforme mostrado aqui para o usuário root no servidor de repo.

# gpg --list-keys
/root/.gnupg/pubring.gpg
------------------------
pub   1024D/2D230C5F 2006-01-03 [expired: 2007-02-07]
uid                  Debian Archive Automatic Signing Key (2006)  <[email protected]>

pub   1024D/7610DDDE 2006-03-03 [revoked: 2016-03-31]
uid                  Archive Maintainer <[email protected]>

pub   4096R/DD219672 2016-04-18
uid                  Archive Maintainer <[email protected]>

Todos os comandos abaixo são como o usuário root. Modifiquei o arquivo repository / conf / distributions para usar a nova subchave criada explicitamente para assinar:

Architectures: i386 amd64 source
Codename: unstable
Components: main
...
SignWith: DD219672

Mas quando uso o dput para atualizar um pacote, recebo

Could not find any key matching 'DD219672'!
ERROR: Could not finish exporting 'unstable'!
This means that from outside your repository will still look like before (and
should still work if this old state worked), but the changes intended with this
call will not be visible until you call export directly (via reprepro export)

E quando executo o reprepro export diretamente, recebo:

# reprepro -V export unstable
Exporting unstable...
 generating main/Contents-i386...
 generating main/Contents-amd64...
Could not find any key matching 'DD219672'!
ERROR: Could not finish exporting 'unstable'!

Eu pesquisei no Google e encontrei alguns tópicos antigos que indicavam um possível problema com o reprepro encontrar o diretório gnupg adequado ... então tentei isso com os mesmos resultados acima:

# GNUPGHOME=/root/.gnupg reprepro -V export unstable

Um tópico sugeriu testar a chave assinando um arquivo fictício que parecia funcionar bem ... pelo menos ele não relatou erros e eu acabei com um arquivo bla.gpg de 576 bytes depois de concluído.

# touch bla
# gpg -u DD219672 --sign bla

A página do manual reprepro também sugere "Se houver problemas com a assinatura, você pode tentar o valor gpg --list-secret-keys para ver como o gpg pode interpretar o valor. Se esse comando não listar nenhuma chave ou várias, tente encontrar algum outro valor (como o keyid), esse gpg pode ser mais facilmente associado a uma chave exclusiva ". Então eu verifiquei isso também e obtive:

# gpg --list-secret-keys DD219672
sec   4096R/DD219672 2016-04-18
uid                  Archive Maintainer <[email protected]>

E, finalmente, consegui entrar em contato com o administrador do sistema que configurou nossos repros e ele sugeriu tentar uma chave sem uma senha. Por isso, gerei uma nova chave de assinatura, DD219672, publiquei-a e repita as etapas acima novamente, mas com o mesmo resultado.

Hoje, depois de ler e estudar mais as páginas de manual e notar que o pgp-agent é iniciado automaticamente quando executo o reprepro, decidi persegui-lo por um tempo.

Eu adicionei um gpg-agent.conf com

debug-level 7
log-file    /root/gpg.agent.log
debug-all

E eu posso ver no log que o gpg-agent não está encontrando as chaves

2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 -> OK Pleased to meet you, process 18903
2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 <- RESET
2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 -> OK
2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 <- OPTION ttyname=/dev/pts/0
2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 -> OK
2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 <- OPTION ttytype=xterm-256color
2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 -> OK
2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 <- GETINFO version
2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 -> D 2.1.11
2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 -> OK
2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 <- OPTION allow-pinentry-notify
2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 -> OK
2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 <- OPTION agent-awareness=2.1.0
2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 -> OK
2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 <- AGENT_ID
2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 -> ERR 67109139 Unknown IPC command <GPG Agent>
2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 <- HAVEKEY C2C5C59E5E90830F314ABB66997CCFAACC5DEA2F 416E8A33354912FF4843D52AAAD43FBF206252D9 8CE77065EA6F3818A4975072C8341F32CB7B0EF0
2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 -> ERR 67108881 No secret key <GPG Agent>
2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 <- [eof]

Até agora, não consegui descobrir onde o gpg-agent está encontrando as chaves listadas no HAVKEY e como apontá-lo na direção certa para encontrar a nova chave, DD219672, para assinar nossos pacotes atualizados.

Andy Dorman
fonte

Respostas:

19

Eu tive o mesmo problema e, depois de muita frustração, finalmente localizei o que estava acontecendo.

A repreproferramenta usa gpgme, com base em gnupg2. Uma versão recente disso mudou a forma como o conjunto de chaves secretas é tratado: https://www.gnupg.org/faq/whats-new-in-2.1.html

O gpg usado para manter os pares de chaves públicas em dois arquivos: pubring.gpge secring.gpg... Com o GnuPG 2.1, isso mudou ... Para facilitar a migração para o método sem separação, o gpg detecta a presença de a secring.gpge converte as chaves rapidamente ao repositório de chaves do gpg-agent (este é o private-keys-v1.ddiretório abaixo do diretório inicial do GnuPG ( ~/.gnupg)). Isso é feito apenas uma vez e um existente secring.gpgnão é mais tocado pelo gpg. Isso permite a coexistência de versões mais antigas do GnuPG com o GnuPG 2.1. No entanto, qualquer alteração nas chaves privadas usando o novo gpg não será exibida ao usar as versões anteriores ao 2.1 do GnuPG e vice-versa.

Portanto, se você criar uma nova chave com gpg, o gpg2 não a verá e vice-versa.

Solução rápida que funcionou para mim:

gpg --export-secret-keys | gpg2 --import -

E se você precisar seguir o outro caminho, é claro:

gpg2 --export-secret-keys | gpg --import -

Dependendo da sua configuração, você também pode querer / precisar adicionar --export-secret-subkeys

Depois de fazer o acima, repreprofuncionou corretamente com minha nova chave.

guepardo
fonte
2
Cara, você merece uma medalha por rastrear isso.
Andrew Schulman
2

Para mim, o problema era que eu gerava chaves como usuário e executei o reprepro como root .

O que aconteceu foi que as chaves que eu gero "sem sudo" são adicionadas ao meu local pubring.gpg. Quando executo, sudo reprepro ...eu o executo como root e, portanto, ele tenta encontrar a chave no root pubring.gpge, obviamente, não encontra uma.

A solução foi executar todos os gpgcomandos como raiz (eq. sudo -iE depois gpg --gen-key). Certifique-se de que, ao executar, sudo gpg --list-keysveja as chaves e a linha desejadas /root/.gnupg/pubring.gpg.

Espero que ajude!

Dmytro Bogatov
fonte