TL; versão DR: estou configurando um repositório apt seguro com um arquivo Release assinado, e ele está me dando uma mensagem de erro "Falha ao buscar a versão", que desaparece completamente quando eu removo o arquivo Release.gpg. Eu posso confirmar que o apt está recebendo o arquivo Release mesmo quando ele diz que é incapaz de fazê-lo.
Minha organização tem a necessidade de um repositório local seguro-apt, onde nós hospedaremos nossa própria cópia de atualizações para o Ubuntu 12.04. A necessidade vem de uma série de razões (largura de banda, pré-teste de atualizações antes de liberar a produção, tudo de sempre). No processo de criação do repositório, eu me deparei com um problema incomum.
Primeiro, o básico. O repositório do apt está sendo hospedado em uma pequena área de trabalho rodando o CentOS 6.5, não um servidor; Atualmente, é uma prova de conceito. Eu estou usando o nginx para atuar como um servidor web, e um Ubuntu 12.04 VM para atuar como um teste de cliente para a prova de conceito. Fiz uma cópia de backup do /etc/apt/sources.list, depois a excluí e comecei do zero. Atualmente, contém apenas:
cat /etc/apt/sources.list
# Test repository for local private apt
deb http://mbwinnc641090/ precise main
A estrutura do diretório foi copiada dos repositórios apt existentes do Ubuntu para o Precise. Os arquivos Release e Release.gpg estão em / dists / precise (onde / é relativo à raiz do servidor web, não ao servidor de arquivos); Packages, Packages.gz e Packages.bz2 estão em / dists / precise / main / binary-amd64. Existe um pacote em / dists / precise / main / binary-i386; ele não aparece em Release.gpg, tem zero bytes de tamanho e foi adicionado apenas para resolver um problema secundário que surgiu enquanto eu estava olhando para o problema real (explicarei com mais detalhes abaixo). Gerei um 4096 RSA / 4096 com o OpenGPG e assinaram o arquivo de lançamento com:
gpg -abs -o Release.gpg Release
Eu exportei a chave pública com
gpg --armor --output ./APT-key-2.key --export <myid>
copiou-o para um pendrive USB e depois o levou para a VM; a chave importada com sucesso para o Ubuntu VM com
apt-key add ./APT-key-2.key
O conteúdo do arquivo Release é o seguinte:
Origin: Ubuntu
Label: Ubuntu
Suite: precise
Version: 12.04
Codename: precise
Date: Wed, 25 Apr 2012 22:49:23 UTC
Architectures: amd64
Components: main restricted universe multiverse
Description: Ubuntu Precise 12.04
MD5Sum:
3a72e2cbeccb018e855e59851c97fafb 1806 main/binary-amd64/Packages
4e8e2385e95080b1c6e61ea032f286af 1023 main/binary-amd64/Packages.bz2
871b13afb486f3faf4174e3c839ad6da 938 main/binary-amd64/Packages.gz
SHA1:
d58e402014879a2d7f9a8890144daf8d05216bc0 1806 main/binary-amd64/Packages
5782287bf8d853da47425dbf15aaf924a4505e1d 1023 main/binary-amd64/Packages.bz2
c469ea854a1f15638fcff418e4ca527bb3a12a52 938 main/binary-amd64/Packages.gz
SHA256:
ec3f7712fecf94de2337a0c554219f370ed2ddb4486e1e1cc147f90fb4b5d765 1806 main/binary-amd64/Packages
5776bcdc534063094459f283619c85861758bae3718273ce6e34b6e052f9a495 1023 main/binary-amd64/Packages.bz2
5c0eedc77ff872f2676c79116e55182e759cb8c41285a49bae075a7ea08f9942 938 main/binary-amd64/Packages.gz
Como você pode ver, ele contém os registros MD5Sum, SHA1 e SHA256 para os arquivos principais / binary-amd64 / Packages, Packages.bz2 e Packages.gz. Eu verifiquei o dobro e o triplo que estão corretos.
Os próprios arquivos Package contêm apenas um registro de pacote (novamente, prova de conceito - começar pequeno e funcionar) para o Firefox. É demorado e eu não acredito que seja relevante para o problema, então vou omiti-lo por enquanto, mas se alguém quiser ver, eu o editarei depois.
Agora, o problema real - quando o apt-get é executado, ele se queixa de falha ao buscar o arquivo Release:
sudo apt-get -s --allow-unauthenticated update
[sudo] passwd for administrator:
Hit http://mbwinnc641090 precise Release.gpg
Hit http://mbwinnc641090 precise Release
W: Failed to fetch http://mbwinnc641090/dists/precise/Release Unable to find expected entry 'main/binary-amd64/Packages' in Release file (Wrong sources.list entry or malformed file)
No entanto, posso confirmar com 100% de certeza que não há falha ao desativar o arquivo Release. Primeiro, os arquivos de log nginx confirmam que o pedido apt está obtendo ambos os arquivos; access.log informa transferências HTTP 304 e 0 byte (ou seja, nenhuma alteração desde a última cópia do arquivo adquirido) ou se eu toco nos dois arquivos no repositório, HTTP 200 e os tamanhos de transferência de ambos os arquivos estão corretos:
Sem toque:
10.113.226.222 - - [21/Feb/2014:08:12:12 -0600] "GET /dists/precise/Release.gpg HTTP/1.1" 304 0 "-" "Debian APT-HTTP/1.3 (0.8.16~exp12ubuntu10.14)" "-"
10.113.226.222 - - [21/Feb/2014:08:12:12 -0600] "GET /dists/precise/Release HTTP/1.1" 304 0 "-" "Debian APT-HTTP/1.3 (0.8.16~exp12ubuntu10.14)" "-"
Toque:
10.113.226.222 - - [21/Feb/2014:10:05:04 -0600] "GET /dists/precise/Release.gpg HTTP/1.1" 200 836 "-" "Debian APT-HTTP/1.3 (0.8.16~exp12ubuntu10.14)" "-"
10.113.226.222 - - [21/Feb/2014:10:05:04 -0600] "GET /dists/precise/Release HTTP/1.1" 200 966 "-" "Debian APT-HTTP/1.3 (0.8.16~exp12ubuntu10.14)" "-"
Ambos os arquivos estão sendo transferidos como texto simples; Eu adicionei a diretiva "default_type text / plain" ao arquivo conf do servidor nginx (note - servidor inteiro, não apenas este host virtual).
Eu também posso confirmar que o apt-get está recebendo os arquivos - / var / lib / apt / lists possui ambos mbwinnc641090_dists_precise_Release e mbwinnc641090_dists_precise_Release.gpg; o conteúdo do arquivo corresponde exatamente ao que está no servidor; o tamanho do arquivo é exatamente o que está no servidor (e o que é transferido de acordo com o nginx); e o registro de data e hora do arquivo muda para corresponder à hora do servidor quando eu toco nos dois arquivos no servidor. O wget também consegue acessar os arquivos, e eu posso navegar diretamente para eles no Chrome / Firefox / etc. Então eles estão lá e disponíveis.
Onde fica realmente estranho é que quando eu removo o Release.gpg do diretório (movo para outro diretório ou renomeio), de repente o comando apt-get update funciona. Não há nada para atualizar (e inicialmente ele se queixou de não conseguir encontrar Packages em / dists / precise / main / binary-i386, que foi embora quando eu criei o arquivo Packages vazio lá), mas a mensagem de erro sobre não ser capaz de remover o Release desaparece completamente e sai com código de erro zero. Então parece que algo sobre o apt não gosta da assinatura que eu tenho. No entanto, posso confirmar que o gpgv é capaz de verificar a assinatura usando o keyring apt:
sudo gpgv --keyring /etc/apt/trusted.gpg mbwinnc641090_dists_precise_Release.gpg mbwinnc641090_dists_precise+Release
gpgv: Signature made Fri 21 Feb 2014 10:04:56 AM CST using RSA key ID AF57B06B
gpgv: Good Signature from "<my info>"
A execução do apt get com "-o Debug :: Acquire :: gpgv = true" confirma ainda mais que o Apt está passando o estágio de validação da chave - apt-get returns:
Hit http://mbwinnc641090 precise Release.gpg
Hit http://mbwinnc641090 precise Release
33% [Release gpgv 966 B]inside VerifyGetSigners
gpgv path: /usr/bin/gpgv
Keyring file: /etc/apt/trusted.gpg
Keyring path: /etc/apt/trusted.gpg.d/
Preparing to exec: /usr/bin/gpgv /usr/bin/gpgv --ignore-time-conflict --status-fd 3 --keyring /etc/apt/trusted.gpg /var/lib/apt/lists/partial/mbwinnc641090_dists_precise_Release.gpg /var/lib/apt/lists/mbwinnc641090_dists_precise_Release
Read: [GNUPG:] SIG_ID sLGwzAAcePo9LZtAdgNf44grYaQ 2014-02-21 1392998696
Read: [GNUPG:] GOODSIG 84332B63AF57B06B <myinfo>
Got GOODSIG, key ID:GOODSIG 84332B63AF57B06B
Read: [GNUPG:] VALIDSIG 09DBAF28ACFD21DC5FBF797784332B63AF57B06B 2014-02-21 1392998696 0 4 0 1 2 00 09DBAF28ACFD21DC5FBF797784332B63AF57B06B
gpgv exited
gpgv succeeded
W: Failed to fetch http://mbwinnc641090/dists/precise/Release Unable to find expected entry 'main/binary-amd64/Packages' in Release file (Wrong sources.list entry or malformed file)
E: Some index files failed to download. They have been ignored, or old ones used instead.
Então basicamente - eu estou sem ideias. Qualquer tipo de ajuda seria apreciada; Eu tenho certeza que neste momento é apenas uma coisa simples incrivelmente estúpida que eu perdi e vocês todos vão dar boas risadas, mas eu estou completamente acabada.