私有 Secure-apt 存储库生成“无法获取”错误,可能是错误的

私有 Secure-apt 存储库生成“无法获取”错误,可能是错误的

TL;DR 版本:我正在设置一个带有签名 Release 文件的安全 apt 存储库,它给了我一个“无法获取 Release”错误消息,当我删除 Release.gpg 文件时,这个错误消息就完全消失了。我可以确认 apt 正在获取 Release 文件,即使它说无法获取。

我的组织需要一个本地安全存储库,我们将在其中托管我们自己的 Ubuntu 12.04 更新副本。这种需要出于多种原因(带宽、在发布到生产之前对更新进行预测试,所有常见的原因)。在构建存储库的过程中,我遇到了一个不寻常的问题。

首先,介绍一下基础知识。apt repo 托管在一台运行 CentOS 6.5 的小型台式机上,而不是服务器上;目前它是概念验证。我使用 nginx 充当 Web 服务器,并使用 Ubuntu 12.04 VM 充当概念验证的客户端测试平台。我备份了 /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/precise(其中 / 相对于 Web 服务器的根目录,而不是文件服务器);Packages、Packages.gz 和 Packages.bz2 位于 /dists/precise/main/binary-amd64。/dists/precise/main/binary-i386 中有一个 Packages;它未出现在 Release.gpg 中,其大小为零字节,仅用于解决我在查看实际问题时出现的次要问题(将在下面详细解释)。我使用 OpenGPG 生成了一个 4096 RSA/4096 RSA 密钥,并使用以下内容对发布文件进行了签名:

gpg -abs -o Release.gpg Release

我已经导出了公钥

gpg --armor --output ./APT-key-2.key --export <myid>

将其复制到 USB 上,然后将其带到虚拟机;密钥已成功导入到 Ubuntu VM 中

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

如您所见,它包含 main/binary-amd64/Packages、Packages.bz2 和 Packages.gz 文件的 MD5Sum、SHA1 和 SHA256 记录。我已反复检查这些记录是否正确。

对于 Firefox,Package 文件本身仅包含一个包记录(再次证明概念 - 从小处着手,逐步完善)。它很长,而且我认为与问题无关,因此我暂时将其省略,但如果有人想看,我会在之后编辑它。

现在,实际的问题是 - 当运行 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 字节传输(即自上次获取文件副本以来没有变化),或者如果我触摸 repo 上的两个文件,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)" "-"

两个文件都以纯文本形式传输;我在 nginx 服务器的 conf 文件中添加了“default_type text/plain”指令(注意 - 整个服务器,而不仅仅是这一个虚拟主机。)

我还可以确认 apt-get 正在接收文件 - /var/lib/apt/lists 同时包含 mbwinnc641090_dists_precise_Release 和 mbwinnc641090_dists_precise_Release.gpg;文件内容与服务器上的内容完全匹配;文件大小与服务器上的内容完全匹配(并且根据 nginx 传输的内容);当我触摸服务器上的两个文件时,文件时间戳会更改为与服务器时间匹配。 wget 也可以成功访问文件,我可以直接在 Chrome/Firefox/等中浏览它们。所以它们在那里并且可用。

真正奇怪的是,当我从目录中删除 Release.gpg(将其移动到另一个目录或重命名)时,apt-get update 命令突然起作用了。它没有什么可更新的(最初它确实抱怨无法在 /dists/precise/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>"

使用“-o Debug::Acquire::gpgv=true”运行 apt get 进一步确认 Apt 正在通过密钥验证阶段 - apt-get 返回:

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.

所以基本上 - 我已经没有主意了。任何帮助都会很感激;我敢肯定,现在我错过了一些极其愚蠢的简单事情,你们都会笑个不停,但我完全被搞砸了。

答案1

这个问题非常非常微妙。

所有井号行前面都需要有一个空格。例如:

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

相关内容