基本信息

源代码仓库

文档

参与

子项目

相关项目

其他

验证 Apache HTTP Server 版本

Apache HTTP Server 项目发布的所有官方代码版本都由该版本的发布经理签名。PGP 签名和 SHA 哈希值与发行版一起提供。

您应该直接从 Apache 软件基金会下载 PGP 签名和 SHA 哈希值,而不是从我们的镜像下载。这样做是为了帮助确保签名文件的完整性。但是,我们鼓励您从我们的镜像下载版本。 (我们的下载页面会将您指向版本的镜像和签名的官方网站,因此这会自动为您完成。)

检查签名

以下示例详细说明了签名交互的工作原理。在此示例中,假设您已经下载了 httpd-2.4.18.tar.gz(版本)和 httpd-2.4.18.tar.gz.asc(分离签名)。

此示例使用 GNU Privacy Guard。任何符合 OpenPGP 的程序都应该能够成功运行。

首先,我们将检查分离签名 (httpd-2.4.18.tar.gz.asc) 与我们的版本 (httpd-2.4.18.tar.gz) 是否匹配。

% gpg --verify httpd-2.4.18.tar.gz.asc httpd-2.4.18.tar.gz
gpg: Signature made Tue Dec  8 21:32:07 2015 CET using RSA key ID 791485A8
gpg: Can't check signature: public key not found

我们本地系统中没有发布经理的公钥 (791485A8)。您现在需要从密钥服务器检索公钥。一个流行的服务器是 pgpkeys.mit.edu(它有一个 网页界面)。公钥服务器相互链接,因此您应该能够连接到任何密钥服务器。您也可以从 https://downloads.apache.org/httpd/KEYS 获取 httpd 发布经理的密钥。

% gpg --keyserver pgpkeys.mit.edu --recv-key 791485A8
gpg: requesting key 791485A8 from HKP keyserver pgpkeys.mit.edu
gpg: trustdb created
gpg: key 791485A8: public key "Jim Jagielski <[email protected]>" imported
gpg: key 791485A8: public key "Jim Jagielski <[email protected]>" imported
gpg: Total number processed: 2
gpg:               imported: 2  (RSA: 2)

在此示例中,您现在已经收到了两个名为“Jim Jagielski <[email protected]>”的实体的公钥。但是,您无法验证这些密钥是否由名为 Jim Jagielski 的人创建,其电子邮件地址为所声称的地址。事实上,其中一个密钥是冒充的。这并不意味着 PGP 存在漏洞,只是您需要查看完整的 40 个字符的密钥指纹,而不是易受攻击的 8 个字符的 ID。

无论如何,让我们尝试再次验证版本签名

% gpg --verify httpd-2.4.18.tar.gz.asc httpd-2.4.18.tar.gz
gpg: Signature made Tue Dec  8 21:32:07 2015 CET using RSA key ID 791485A8
gpg: Good signature from "Jim Jagielski <[email protected]>"
gpg:		     aka "Jim Jagielski <[email protected]>"
gpg:             aka "Jim Jagielski <[email protected]>"
gpg:             aka "Jim Jagielski <[email protected]>"
gpg: checking the trustdb
gpg: no ultimately trusted keys found
gpg: WARNING: This key is not certified with a trusted signature!
gpg:	      There is no indication that the signature belongs to the
owner.
Fingerprint: A93D 62EC C3C8 EA12 DB22  0EC9 34EA 76E6 7914 85A8

此时,签名是有效的,但我们不信任此密钥。有效的签名意味着文件没有被篡改。但是,由于公钥加密的性质,您还需要额外验证密钥 A93D62ECC3C8EA12DB220EC934EA76E6791485A8 是否是由真正的 Jim Jagielski 创建的。

任何攻击者都可以创建一个公钥并将其上传到公钥服务器。然后,他们可以使用此伪造密钥创建一个恶意版本。然后,如果您尝试验证此损坏版本的签名,它将成功,因为密钥不是“真正的”密钥。因此,您需要验证此密钥的真实性。

验证密钥的真实性

验证的关键步骤是确认公钥的密钥指纹。我们在验证下载时看到了指纹:它是 A93D 62EC C3C8 EA12 DB22 0EC9 34EA 76E6 7914 85A8

有两种方法可以验证 Jim 的指纹。真正安全的方法(如下所述)是使用 PGP 的“信任网”,这将为您提供到 Jim 密钥的加密强信任链。但是,如果您是 PGP 新手,这需要一些时间和精力。一个通往合理安全级别的捷径是检查 Jim 的指纹(始终使用 https,而不是 http)与 Apache 基金会维护的 Apache 开发人员指纹数据库进行比较,网址为 https://downloads.apache.org/httpd/KEYS。请注意,如果 Apache 网站遭到破坏,或者冒充者通过获取伪造证书并冒充该网站来破坏 HTTPS 安全,则此捷径将彻底失败。请务必关注技术新闻,了解任何此类事件的报道!

验证密钥的一个好方法是与多个人进行面对面的交流,并确认其政府颁发的带照片的身份证件。但是,每个人都可以自由地制定自己的标准来确定密钥的真实性。有些人通过电话阅读密钥签名(语音验证)就感到满意。有关确定最适合您的信任级别的更多信息,请阅读 GNU Privacy Handbook 中关于 验证公钥环上的其他密钥 的部分。

大多数 Apache HTTP Server 开发人员都尝试签署彼此的密钥(通常通过面对面验证)。因此,为了进入信任网,您只需要验证信任网中的一人即可。(提示:我们所有开发人员的密钥都在 KEYS 文件中。)

例如,以下人员签署了 Jim Jagielski 的公钥。如果您验证此列表中的任何密钥,您将拥有到 791485A8 密钥的信任路径。如果您验证一个验证 791485A8 签名者的密钥,那么您将拥有一个信任路径。(依此类推。)

% gpg --list-sigs 
pub   4096R/791485A8 2010-11-04
uid                  Jim Jagielski (Release Signing Key) <[email protected]>
sig          88C3A5A5 2010-11-07  Philippe M. Chiasson (Home) <[email protected]>
sig          4E24517C 2011-11-10  Hyrum K. Wright (Personal) <[email protected]>
sig          C4FC9A65 2011-11-10  Bernd Bohmann <[email protected]>
sig          1F27E622 2015-04-16  Konstantin I Boudnik (Cos) <[email protected]>
sig          08C975E5 2010-11-04  Jim Jagielski <[email protected]>
sig 2        F2EFD0F0 2011-11-14  Christopher David Schultz (Christopher David Schultz) <[email protected]>
sig 3        311A3DE5 2010-11-10  Ruediger Pluem <[email protected]>
sig          64A6A0BA 2013-02-27  Steven J. Hathaway (Apache PGP) <[email protected]>
sig          00A1234F 2015-04-15  Andre Arcilla <[email protected]>
sig          9A59B973 2015-04-21  Stefan Sperling <[email protected]>
sig          F51BB88A 2010-11-04  Sander Temme <[email protected]>
...more signatures redacted...

由于开发人员通常都很忙,您可能无法立即找到愿意进行面对面验证的人(他们甚至可能不会回复您的电子邮件,因为他们太忙了!)。如果您附近没有开发人员或难以找到合适的人选,请发送电子邮件到您尝试验证的密钥的地址。他们可能能够找到愿意验证其密钥的人,或者安排其他验证机制。

进入信任网后,您应该在验证版本签名时看到以下内容。

% gpg --verify httpd-2.4.18.tar.gz.asc httpd-2.4.18.tar.gz
gpg: Signature made Tue Dec  8 21:32:07 2015 CET using RSA key ID 791485A8
gpg: Good signature from "Jim Jagielski (Release Signing Key) <[email protected]>"
gpg:                 aka "Jim Jagielski <[email protected]>"
gpg:                 aka "Jim Jagielski <[email protected]>"
gpg:                 aka "Jim Jagielski <[email protected]>"

为了检查下载文件的完整性,您需要下载源代码和相关的 SHA256 哈希值。例如,假设您更喜欢 tar.bz,要验证 2.4.34 版本,您最终应该在磁盘上获得两个文件

在大多数 Unix 系统上,这只是一个执行以下操作的问题

% shasum -a 256 -c httpd-2.4.34.tar.bz2.sha256
httpd-2.4.34.tar.bz2: OK

在幕后,该命令检查 httpd-2.4.34.tar.bz2.sha256 中包含的 SHA 哈希值是否与为文件 httpd-2.4.34.tar.bz2 计算的 SHA 哈希值匹配。正确的结果应该是显示的“OK”。

另一种计算文件 SHA256 哈希值的方法是使用 openssl

% openssl sha256 -r httpd-2.4.34.tar.bz2
fa53c95631febb08a9de41fd2864cfff815cf62d9306723ab0d4b8d7aa1638f0 *httpd-2.4.34.tar.bz2

然后验证 httpd-2.4.34.tar.bz2.sha256 的内容是否与上述结果匹配。