所有内核发布版本均使用符合 OpenPGP 规范的签名进行加密签名。强烈建议所有人通过验证相应的签名来验证下载的内核发布版本的完整性。
基本概念
每个内核发布版本都附带发布者的加密签名。此加密签名允许任何人验证文件在开发者创建和签名后是否已被修改或以其他方式篡改。签名和验证过程使用公钥加密技术,并且在未首先获取开发者私钥的情况下伪造 PGP 签名几乎是不可能的。如果发生这种情况,开发者将撤销受损的密钥,并使用新密钥重新签署所有先前签名的发布版本。
要了解有关 PGP 工作原理的更多信息,请查阅 维基百科。
Kernel.org 信任网络
kernel.org 成员使用的 PGP 密钥由 Linux 内核开发社区的其他成员(通常还有许多其他人)交叉签名。如果您想验证任何属于 kernel.org 成员的密钥的有效性,您可以查看其公钥上的签名列表,然后决定是否信任该密钥。请参阅有关信任网络的维基百科文章。
使用 Web 密钥目录
如果维护您自己的信任网络任务过于艰巨,您可以选择通过使用“首次使用即信任”(TOFU) 方法并依赖 kernel.org Web 密钥目录 (WKD) 来简化此过程。
要导入属于许多内核开发者的密钥,您可以使用以下命令
$ gpg2 --locate-keys [username]@kernel.org
例如,要导入属于 Linus Torvalds 和 Greg Kroah-Hartman 的密钥,您将使用
$ gpg2 --locate-keys torvalds@kernel.org gregkh@kernel.org
此命令在将这些密钥导入您的密钥环之前,将验证 kernel.org 提供的 TLS 证书。
使用 GnuPG 验证内核签名
通过 kernel.org 发布的所有软件都带有分离的 PGP 签名,您可以使用它们来验证下载的完整性。
为了说明验证过程,让我们以 Linux 4.6.6 发布版本为例进行演练。首先,使用“curl”下载发布版本和相应的签名
$ curl -OL https://linuxkernel.org.cn/pub/linux/kernel/v4.x/linux-4.6.6.tar.xz $ curl -OL https://linuxkernel.org.cn/pub/linux/kernel/v4.x/linux-4.6.6.tar.sign
您会注意到签名是针对未压缩的存档版本进行的。这样做是为了 .gz 和 .xz 压缩的发布版本只需要一个签名。首先解压缩存档,使用unxz在本例中
$ unxz linux-4.6.6.tar.xz
现在根据签名验证 .tar 存档
$ gpg2 --verify linux-4.6.6.tar.sign
您可以将这些步骤合并成一行命令
$ xz -cd linux-4.6.6.tar.xz | gpg2 --verify linux-4.6.6.tar.sign -
您可能会收到“无公钥错误”
gpg: Signature made Wed 10 Aug 2016 06:55:15 AM EDT using RSA key ID 38DBBDC86092693E gpg: Can't check signature: No public key
请使用“gpg2 --locate-keys”命令(如上所示)下载 Greg Kroah-Hartman 和 Linus Torvalds 的密钥,然后重试
$ gpg2 --locate-keys torvalds@kernel.org gregkh@kernel.org $ gpg2 --verify linux-4.6.6.tar.sign gpg: Signature made Wed 10 Aug 2016 06:55:15 AM EDT gpg: using RSA key 38DBBDC86092693E gpg: Good signature from "Greg Kroah-Hartman <gregkh@kernel.org>" [unknown] 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: 647F 2865 4894 E3BD 4571 99BE 38DB BDC8 6092 693E
要使“警告”消息消失,您可以指示您选择使用 TOFU 信任该密钥
$ gpg2 --tofu-policy good 38DBBDC86092693E $ gpg2 --trust-model tofu --verify linux-4.6.6.tar.sign gpg: Signature made Wed 10 Aug 2016 06:55:15 AM EDT gpg: using RSA key 38DBBDC86092693E gpg: Good signature from "Greg Kroah-Hartman <gregkh@kernel.org>" [full] gpg: gregkh@kernel.org: Verified 1 signature in the past 53 seconds. Encrypted 0 messages.
请注意,您可能需要在首次运行验证命令时传递“--trust-model tofu”,但此后应该不再需要。
脚本版本
如果您需要在自动化环境中执行此任务,或者只是喜欢更方便的工具,您可以使用以下辅助脚本正确下载和验证 Linux 内核 tarball
在根据您的需求采用此脚本之前,请对其进行审查。
重要指纹
以下是 Linus Torvalds、Greg Kroah-Hartman、Sasha Levin 和 Ben Hutchings 的密钥指纹,他们是最有可能发布内核的人
开发者 | 指纹 |
---|---|
Linus Torvalds | ABAF 11C6 5A29 70B1 30AB E3C4 79BE 3E43 0041 1886 |
Greg Kroah-Hartman | 647F 2865 4894 E3BD 4571 99BE 38DB BDC8 6092 693E |
Sasha Levin | E27E 5D8A 3403 A2EF 6687 3BBC DEA6 6FF7 9777 2CDC |
Ben Hutchings | AC2B 29BD 34A6 AFDD B3F6 8F35 E7BF C8EC 9586 1109 |
在信任以上信息之前,请在您的浏览器中验证本站点的 TLS 证书。
如果您收到“BAD signature”(坏签名)
如果您在任何时候看到“BAD signature”来自“gpg2 --verify”的输出,请首先检查以下几点
- 确保您正在针对存档的 .tar 版本(而不是压缩的 (.tar.xz) 版本)验证签名。
- 确保下载的文件正确无误,未被截断或以其他方式损坏。
如果您反复收到相同的“BAD signature”输出,请发送电子邮件至 helpdesk@kernel.org,以便我们调查问题。
Kernel.org 校验和自动签名器和 sha256sums.asc
我们有一个专用的脱机系统,它直接连接到我们的中央附加存储,并为所有上传的软件发布版本计算校验和。生成的sha256sums.asc文件随后使用为此目的生成的 PGP 密钥进行签名,该密钥在该系统之外不存在。
这些校验和并非旨在取代开发者签名。它仅仅是一种快速验证 kernel.org 众多镜像之一上的内容是否与主镜像上的内容匹配的方式。虽然您可以使用它们来快速验证您下载的内容是否与我们中央存储系统上的内容匹配,但为了获得最佳保证,您仍应继续使用开发者签名。
2011 年 9 月之前的内核发布版本
在 2011 年 9 月之前,所有内核发布版本都由同一个 PGP 密钥自动签名
pub 1024D/517D0F0E 2000-10-10 [revoked: 2011-12-11] Key fingerprint = C75D C40A 11D7 AF88 9981 ED5B C86B A06A 517D 0F0E uid Linux Kernel Archives Verification Key <ftpadmin@kernel.org>
由于 kernel.org 系统遭到入侵,此密钥已退役并被吊销。此密钥将不再用于签署未来的发布版本,您不应使用此密钥来验证任何存档的完整性。几乎可以肯定,此密钥已落入恶意方手中。
以前用此密钥签名的所有内核发布版本都已交叉检查并用为此目的专门创建的另一个密钥签名
pub 3072R/C4790F9D 2013-08-08 Key fingerprint = BFA7 DD3E 0D42 1C9D B6AB 6527 0D3B 3537 C479 0F9D uid Linux Kernel Archives Verification Key (One-off resigning of old releases) <ftpadmin@kernel.org>
用于此目的的私钥已被销毁,不能用于签署 2011 年之后发布的任何版本。