所有内核发布都使用符合 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 内核 tar 包
在根据您的需求采用此脚本之前,请先查看它。
重要指纹
以下是 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 年之后生成的任何发布。