Apache HTTP 伺服器專案發佈的所有官方程式碼版本皆由該版本的發佈經理簽署。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 <jim@apache.org>" imported
gpg: key 791485A8: public key "Jim Jagielski <jim@apache.org>" imported
gpg: Total number processed: 2
gpg: imported: 2 (RSA: 2)
在此範例中,您現在已收到兩個名為 'Jim Jagielski <jim@apache.org>' 的實體的公鑰。但是,您無法驗證這些金鑰是否是由自稱電子郵件地址為 jim@apache.org 的 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 <jim@apache.org>"
gpg: aka "Jim Jagielski <jim@jimjag.com>"
gpg: aka "Jim Jagielski <jim@jaguNET.com>"
gpg: aka "Jim Jagielski <jimjag@gmail.com>"
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 的新手,這需要一些時間和精力。獲得合理安全等級的捷徑是,在 Apache 基金會維護的 Apache 開發人員指紋資料庫中檢查 Jim 的指紋(一律使用 https,而不是 http),網址為 https://downloads.apache.org/httpd/KEYS。請注意,如果 Apache 網站遭到入侵,或者冒名頂替者透過取得偽造憑證並假冒網站來破壞 HTTPS 安全性,則此捷徑會導致災難性的後果。請務必留意科技新聞,以瞭解任何此類事件的新聞報導!
驗證金鑰的一個良好起點是透過面對面溝通,並確認多個政府核發的身分證件照片。但是,每個人都可以自由設定自己的標準來判斷金鑰的真實性。有些人只要透過電話讀取金鑰簽章(語音驗證)就感到滿意了。如需詳細瞭解如何判斷最適合您的信任等級,請參閱 GNU Privacy Handbook 中關於 驗證公鑰環上的其他金鑰 的章節。
大多數 Apache HTTP 伺服器開發人員都嘗試簽署彼此的金鑰(通常透過面對面驗證)。因此,為了進入信任網,您只需要驗證我們信任網中的某個人即可。(提示:我們所有開發人員的金鑰都位於 KEYS 檔案中。)
例如,以下人員已簽署 Jim Jagielski 的公鑰。如果您驗證此列表中的任何金鑰,您將擁有通往 791485A8 金鑰的信任路徑。如果您驗證的金鑰驗證了 791485A8 的其中一個簽署者,則您將擁有信任路徑。(以此類推。)
% gpg --list-sigs
pub 4096R/791485A8 2010-11-04
uid Jim Jagielski (Release Signing Key) <jim@apache.org>
sig 88C3A5A5 2010-11-07 Philippe M. Chiasson (Home) <gozer@ectoplasm.org>
sig 4E24517C 2011-11-10 Hyrum K. Wright (Personal) <hyrum@hyrumwright.org>
sig C4FC9A65 2011-11-10 Bernd Bohmann <bommel@apache.org>
sig 1F27E622 2015-04-16 Konstantin I Boudnik (Cos) <cos@boudnik.org>
sig 08C975E5 2010-11-04 Jim Jagielski <jim@apache.org>
sig 2 F2EFD0F0 2011-11-14 Christopher David Schultz (Christopher David Schultz) <chris@christopherschultz.net>
sig 3 311A3DE5 2010-11-10 Ruediger Pluem <rpluem@apache.org>
sig 64A6A0BA 2013-02-27 Steven J. Hathaway (Apache PGP) <shathaway@apache.org>
sig 00A1234F 2015-04-15 Andre Arcilla <arcilla@apache.org>
sig 9A59B973 2015-04-21 Stefan Sperling <stsp@stsp.name>
sig F51BB88A 2010-11-04 Sander Temme <sander@temme.net>
...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) <jim@apache.org>"
gpg: aka "Jim Jagielski <jim@jimjag.com>"
gpg: aka "Jim Jagielski <jim@jaguNET.com>"
gpg: aka "Jim Jagielski <jimjag@gmail.com>"
為了檢查下載檔案的完整性,您需要下載原始碼和相關的 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 計算出的雜湊值相符。正確的結果應該會顯示「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 的內容是否與上述結果相符。