如何安全地下载和 gpg 验证 Debian 源包?

14 apt debian software-sources gnupg

我需要来自 Debian 的特定(源代码或二进制)软件包。

我可以使用 apt-get 下载软件包吗?

如何将 Debian 存储库添加到我的 sources.list 中,以便它仅在个案基础上使用?使用整个 Debian 存储库不会弄乱我的系统?

如何获取 Debian 存储库的 gpg 密钥以确保软件包已由 Debian 存档签名?

(请不要告诉我,系统可能会崩溃。我知道这一点并且不在乎,因为我可以轻松恢复 VM 快照。)

oer*_*dnj 15

有几个问题我将分别回答:

如何下载(而不是安装)单个二进制包?

apt-get 可以选择只下载软件包:

-d  Download only - do NOT install or unpack archives
Run Code Online (Sandbox Code Playgroud)

您将在/var/cache/apt/archives/. 在这种情况下,您必须向 apt 添加新的源列表配置。

如何下载单个源包?

apt-get source <package>
Run Code Online (Sandbox Code Playgroud)

或者当您知道 .dsc 文件的位置时:

dget http://http.debian.net/debian/pool/main/k/knot/knot_1.2.0~rc3-1.dsc
Run Code Online (Sandbox Code Playgroud)

两种方法都验证文件上的签名

如何固定sources.list aka 如何不弄乱我的安装?

您已经指出了APT Pinning的基本描述页面,我只想补充一点,您可能想阅读apt_preferences 手册页,其中也有很好的示例来完成您需要的事情。特别是请参阅示例中的“跟踪稳定”部分,因为它描述了非常接近您的需求的内容:

在使用多个源和 APT 固定时,有一个有用的命令:

# apt-cache policy knot
knot:
  Installed: 1.1.3-1~bpo60+1
  Candidate: 1.2.0~rc3-1~bpo60+1
  Version table:
     1.2.0~rc3-1~bpo60+1 0
        500 http://deb.knot-dns.cz/debian/ squeeze/main amd64 Packages
 *** 1.1.3-1~bpo60+1 0
        100 /var/lib/dpkg/status
     1.0.5-1~bpo60+1 0
        500 http://ppa.sury.org/debian/ squeeze/main amd64 Packages
Run Code Online (Sandbox Code Playgroud)

这表明安装的版本是 1.1.3-1~bpo60+1,候选版本是 1.2.0~rc3-1~bpo60+1,接下来会安装apt-get upgrade。还有一些旧版本可以从另一个存储库中获得。

如何下载 Debian 存档密钥?

Debian 存档密钥发布在ftp-master 上。您需要将密钥导入您的 gpg 密钥环:

$ gpg --import archive-key-6.0.asc 
gpg: key 473041FA: public key "Debian Archive Automatic Signing Key (6.0/squeeze) <ftpmaster@debian.org>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   9  signed:  31  trust: 0-, 0q, 0n, 0m, 0f, 9u
gpg: depth: 1  valid:  31  signed:  38  trust: 25-, 0q, 0n, 1m, 5f, 0u
gpg: depth: 2  valid:  21  signed:  31  trust: 19-, 0q, 0n, 0m, 2f, 0u
gpg: depth: 3  valid:   3  signed:  12  trust: 2-, 0q, 0n, 0m, 1f, 0u
gpg: depth: 4  valid:   1  signed:   8  trust: 1-, 0q, 0n, 0m, 0f, 0u
gpg: next trustdb check due at 2013-09-22
Run Code Online (Sandbox Code Playgroud)

然后你必须检查它的签名:

$ gpg --list-sig 473041FA
pub   4096R/473041FA 2010-08-27 [expires: 2018-03-05]
uid                  Debian Archive Automatic Signing Key (6.0/squeeze) <ftpmaster@debian.org>
sig 3        473041FA 2010-08-27  Debian Archive Automatic Signing Key (6.0/squeeze) <ftpmaster@debian.org>
sig          7E7B8AC9 2010-08-27  Joerg Jaspert <joerg@debian.org>
sig     P    B12525C4 2010-08-27  [User ID not found]
sig          D0EC0723 2010-08-27  [User ID not found]
sig          8AEA8FEE 2010-08-27  [User ID not found]
sig          A3AE44A4 2010-08-28  [User ID not found]
sig          00D8CD16 2010-08-28  Alexander Reichle-Schmehl <alexander@reichle.schmehl.info>
sig          CD15A883 2010-08-28  [User ID not found]
sig          672C8B12 2010-08-28  [User ID not found]
sig 2        C4CF8EC3 2010-08-28  [User ID not found]
sig 2        D628A5CA 2010-08-28  [User ID not found]
Run Code Online (Sandbox Code Playgroud)

并通过手动跟踪或在PGP 密钥统计项目中进行检查来向 Debian 开发人员跟踪单个 GPG 密钥。除非有一条从您的 PGP/GPG 密钥到 Debian 密钥档案的链,否则您将不得不在某个时间点做出信心的飞跃。

如何手动下载和验证单个包

所以另一种方法更复杂,因为 deb 包不是单独签名的,而是只对Release文件进行签名。因此,您需要下载并验证签名ReleasePackages文件以及单个包。

我将添加一个更清晰的示例。

想象一下,您想从Ubuntu的官方 PPA 中下载用于Knot DNS 的Debian 软件包,软件包适用于 amd64 架构。

您必须单击目录并找到这些文件:

wget http://ppa.launchpad.net/cz.nic-labs/knot-dns/ubuntu/dists/precise/Release
wget http://ppa.launchpad.net/cz.nic-labs/knot-dns/ubuntu/dists/precise/Release.gpg
wget http://ppa.launchpad.net/cz.nic-labs/knot-dns/ubuntu/dists/precise/main/binary-amd64/Packages
wget http://ppa.launchpad.net/cz.nic-labs/knot-dns/ubuntu/pool/main/k/knot/knot_1.2.0~rc3-1~precise+1_amd64.deb
Run Code Online (Sandbox Code Playgroud)

下一步是验证Release文件上的签名:

$ gpg --verify Release.gpg Release
gpg: Signature made Fri 01 Mar 2013 07:14:38 PM CET using RSA key ID F9C59A45
gpg: Good signature from "Launchpad Datové schránky"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 5246 3488 670E 69A0 9200  7C24 F233 1238 F9C5 9A45
Run Code Online (Sandbox Code Playgroud)

当然,您需要以其他方式验证密钥(例如 Debian/Ubuntu 维护者密钥,从启动板检查它,等等...)

当您验证了Release文件上的正确签名后,您可以进行下一步 - 验证包文件。

sha256sum Packages
c96a524398cf6e9db033c8299974fe324eba47cc8190efec6495c74e251330ad  Packages
$ grep c96a524398cf6e9db033c8299974fe324eba47cc8190efec6495c74e251330ad Release
 c96a524398cf6e9db033c8299974fe324eba47cc8190efec6495c74e251330ad             3379 main/binary-amd64/Packages
Run Code Online (Sandbox Code Playgroud)

如您所见,签名可以在签名Release文件中找到,因此我们Packages通过计算和比较其 SHA-256 指纹来验证文件的完整性。

最后一步类似。您需要计算和比较单个包的指纹:

$ sha1sum knot_1.2.0~rc3-1~precise+1_amd64.deb 
8b34078e9bfef7aa818b2f926a28838b0ede9f43  knot_1.2.0~rc3-1~precise+1_amd64.deb
$ grep -A 13 "Package: knot$" Packages | grep "^SHA1: "
SHA1: 8b34078e9bfef7aa818b2f926a28838b0ede9f43
Run Code Online (Sandbox Code Playgroud)

在这一点上,我们已经安全地将包链接到签名Release文件。因此,如果您相信Release文件上的签名,则可以确定该软件包是完整下载的。

您可以在 Debian Wiki 上的Secure APT文章中阅读更多内容。