所有内核发布都使用符合 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 [email protected] [email protected]
此命令将在将这些密钥导入您的密钥环之前验证 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 -
您可能会收到“No public key error”错误
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 [email protected] [email protected]
$ 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 <[email protected]>" [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 <[email protected]>" [full]
gpg: [email protected]: Verified 1 signature in the past 53 seconds. Encrypted
0 messages.
请注意,您可能需要在第一次运行 verify 命令时传递“--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”输出,请发送电子邮件至 [email protected],以便我们调查问题。
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 <[email protected]>
由于 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) <[email protected]>
用于此目的的私钥已被销毁,无法用于签署 2011 年之后产生的任何版本。