如何安全地下载和使用 GPG 验证 Debian 源代码包?

我需要从Debian获取特定的(源码或二进制)软件包。
我可以使用apt-get下载这个软件包吗?
如何将Debian存储库添加到我的sources.list中,以便只在需要时使用它?而不会通过使用整个Debian存储库来搞乱我的系统?
如何获取Debian存储库的gpg密钥,以确保软件包由Debian存档签名?
(请不要告诉我系统可能会出问题。我已经意识到了,并且并不在意,因为我可以轻松恢复虚拟机快照。)

解决方案的一部分可能是debian-archive-keyring软件包,它包含了/usr/share/keyrings/debian-archive-keyring.gpg文件。 - James Mitch
解决方案的另一部分可能是Apt-Pinning:http://jaqque.sbih.org/kplug/apt-pinning.html - James Mitch
这个回答有帮助吗?http://askubuntu.com/questions/263705/is-there-a-way-to-pull-source-for-a-package-for-a-specific-release/263755#263755 - andol
1个回答

有几个问题我会逐个回答:
如何下载(而不是安装)单独的二进制包?
apt-get有一个选项只下载包:
-d  Download only - do NOT install or unpack archives

你会在/var/cache/apt/archives/目录下找到已下载的软件包。在这种情况下,你需要向apt添加一个新的源列表配置。 如何下载单个源代码包?
apt-get source <package>

或者当您知道.dsc文件的位置时:
dget http://http.debian.net/debian/pool/main/k/knot/knot_1.2.0~rc3-1.dsc

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

如何固定sources.list,也就是如何不搞乱我的安装?

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

在处理多个源和APT Pinning时,有一个有用的命令:

# 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

这显示已安装的版本为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

然后你将需要检查它的签名:
$ 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]

跟踪Debian开发者的个人GPG密钥,可以手动跟踪,或者检查PGP Key Statistics项目。除非你的PGP/GPG密钥与Debian密钥存档之间存在链接,否则在某个时间点上你将不得不相信一次。 如何手动下载和验证单个软件包 因此,另一种方法更加复杂,因为deb软件包并不是单独签名的,而只有Release文件被签名。因此,您需要下载并验证ReleasePackages文件以及单个软件包的签名。
我将添加一个更清晰的示例。
假设您想从官方PPA下载Ubuntu precise上amd64架构的Knot DNS的Debian软件包。
您将需要浏览目录并找到这些文件:
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

下一步是验证“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

当然,您需要通过其他方式验证密钥(例如Debian / Ubuntu维护者密钥,在launchpad上检查等等...)
当您验证了Release文件上的正确签名后,可以进行下一步 - 验证Packages文件。
sha256sum Packages
c96a524398cf6e9db033c8299974fe324eba47cc8190efec6495c74e251330ad  Packages
$ grep c96a524398cf6e9db033c8299974fe324eba47cc8190efec6495c74e251330ad Release
 c96a524398cf6e9db033c8299974fe324eba47cc8190efec6495c74e251330ad             3379 main/binary-amd64/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

在这一点上,我们已经将包安全地链接到签名的“Release”文件上。因此,如果您相信“Release”文件上的签名,您可以确信该包已完整下载。
您可以在Debian Wiki的Secure APT文章中阅读更多内容。

请解释一下为什么gpg命令不需要root权限?它应该是一个管理员工具。 - Sopalajo de Arrierez
1@SopalajodeArrierez 这不是一个行政工具;你可以在这里阅读更多关于GnuPG的信息:https://gnupg.org/ - oerdnj