TL; DR версия: Я настраиваю безопасное хранилище apt с подписанным файлом Release, и оно дает мне сообщение об ошибке «Failed to fetch Release», которое полностью исчезает, когда я удаляю Файл Release.gpg. Я могу подтвердить, что apt получает файл Release, даже когда говорит, что не может.
Моя организация нуждается в локальном репозитории secure-apt, где мы разместим нашу собственную копию обновлений для Ubuntu 12.04. Необходимость возникает по ряду причин (пропускная способность, предварительное тестирование обновлений перед выпуском в производство, все обычное.) В процессе создания репозитория я столкнулся с необычной проблемой.
1113 Во-первых, основы. Репозиторий apt размещается на небольшом рабочем столе под управлением CentOS 6.5, а не на сервере; в настоящее время это доказательство концепции. Я использую nginx для работы в качестве веб-сервера и виртуальную машину Ubuntu 12.04 в качестве тестовой площадки для проверки концепции. Я сделал резервную копию /etc/apt/sources.list, затем удалил ее и начал с нуля. В настоящее время он содержит только:
cat /etc/apt/sources.list
# Test repository for local private apt
deb http://mbwinnc641090/ precise main
Структура каталогов была скопирована из существующих репозиториев Ubuntu apt для Precise. Файлы Release и Release.gpg находятся в / dists / точный (где / относится к корню веб-сервера, а не к файловому серверу); Packages, Packages.gz и Packages.bz2 находятся в / dists / Precision / Main / binary-amd64. Есть пакеты в / dists / точные / основные / двоичные-i386; он не отображается в Release.gpg, его размер равен 0 байт, и он был добавлен только для решения вторичной проблемы, которая возникла, когда я смотрел на реальную проблему (более подробно объясню ниже). Я сгенерировал 4096 RSA / 4096 RSA ключом с OpenGPG, и я подписал файл релиза с:
gpg -abs -o Release.gpg Release
Я экспортировал открытый ключ с помощью
gpg --armor --output ./APT-key-2.key --export <myid>
скопировал его на флешку USB и затем принес это к ВМ; ключ успешно импортирован на виртуальную машину Ubuntu с
apt-key add ./APT-key-2.key
Содержимое файла Release выглядит следующим образом:
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
Как видите, он содержит записи MD5Sum, SHA1 и SHA256 для Файлы main / binary-amd64 / Packages, Packages.bz2 и Packages.gz. Я дважды и трижды проверил, что это правильно.
Файлы пакета содержат только одну запись пакета (опять же, подтверждение концепции - начните с малого и работайте) для Firefox. Это долго, и я не верю, что это имеет отношение к проблеме, поэтому я пока опущу ее, но если кто-то захочет это увидеть, я отредактирую ее позже.
Теперь актуальная проблема - когда запускается apt-get, он жалуется на невозможность получить файл 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)
Однако я могу со 100% уверенностью подтвердить, что это не не удалось вытащить файл Release вниз. Во-первых, файлы журнала nginx подтверждают, что запрос apt получает оба файла; access.log сообщает о переносах HTTP 304 и 0 байтов (т. е. без изменений с момента получения последней копии файла), или, если я коснусь обоих файлов в репозитории, HTTP 200 и размеры переноса обоих файлов будут правильными:
Нет касания:
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)" "-"
Касание:
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)" "-"
Оба файла передаются в виде открытого текста; Я добавил директиву default_type text / plain в файл conf для сервера nginx (примечание - весь сервер, а не только этот виртуальный хост).
Я также могу подтвердить, что apt-get получает файлы - / var / lib / apt / lists содержит mbwinnc641090_dists_precise_Release и mbwinnc641090_dists_precise_Release.gpg; содержимое файла точно соответствует содержимому сервера; размер файла точно соответствует тому, что находится на сервере (и что передается в соответствии с nginx); и метка времени файла изменяется, чтобы соответствовать времени сервера, когда я касаюсь обоих файлов на сервере. wget также успешно получает доступ к файлам, и я могу просматривать их напрямую в Chrome / Firefox / etc. Так что они там и доступны.
Что действительно странно, так это то, что когда я удаляю Release.gpg из каталога (перемещаю его в другой каталог или переименовываю), внезапно работает команда обновления apt-get. Там нет ничего для обновления (и первоначально он жаловался на невозможность найти пакеты в / dists / Precision / Main / binary-i386, который исчез, когда я создал там пустой файл Packages), но сообщение об ошибке не возможность удаления Release полностью исчезает и завершается с нулевым кодом ошибки. Так что похоже на то, что в apt не нравится подпись, которую я имею. Однако я могу подтвердить, что gpgv может проверить подпись, используя набор ключей 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>"
Запуск apt get с помощью «-o Debug :: Acquire :: gpgv = true» еще раз подтверждает, что Apt проходит ключевой этап проверки - apt-get return:
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.
Так что в основном - у меня нет идей. Любая помощь вообще будет оценена; Я уверен, что на данный момент это просто невероятно глупая простая вещь, которую я пропустил, и вы все посмеетесь, но я совершенно отсталый.
Проблема очень, очень тонкая.
Все хеш-строки должны иметь пробел перед ними. Например, это:
MD5Sum:
3a72e2cbeccb018e855e59851c97fafb 1806 main/binary-amd64/Packages
4e8e2385e95080b1c6e61ea032f286af 1023 main/binary-amd64/Packages.bz2
871b13afb486f3faf4174e3c839ad6da 938 main/binary-amd64/Packages.gz
должно быть:
MD5Sum:
3a72e2cbeccb018e855e59851c97fafb 1806 main/binary-amd64/Packages
4e8e2385e95080b1c6e61ea032f286af 1023 main/binary-amd64/Packages.bz2
871b13afb486f3faf4174e3c839ad6da 938 main/binary-amd64/Packages.gz