HTTP公鑰固定
HTTP公鑰固定(又稱HTTP公鑰釘扎,英語:HTTP Public Key Pinning,縮寫HPKP)[1]是HTTPS網站防止攻擊者利用數位憑證認證機構(CA)錯誤簽發的憑證進行中間人攻擊的一種安全機制,用於預防CA遭受入侵或其他會造成CA簽發未授權憑證的情況。採用公鑰固定時,網站會提供已授權公鑰的雜湊列表,指示客戶端在後續通訊中只接受列表上的公鑰。
工作原理
伺服器通過Public-Key-Pins
(或Public-Key-Pins-Report-Only
用於監測)HTTP頭向瀏覽器傳遞HTTP公鑰固定資訊。
HTTP公鑰固定將網站X.509憑證鏈中的一個SPKI(和至少一個備用金鑰)以pin-sha256
方式進行雜湊,由參數max-age
(單位秒)所指定一段時間,可選參數includeSubDomains
決定是否包含所有子域名,另一個可選參數report-uri
決定是否回報違反HTTP公鑰固定策略的事例。在max-age
所指定的時間內,憑證鏈中憑證的至少一個公鑰須和固定公鑰相符,這樣客戶端才認為該憑證鏈是有效的。[2]
RFC 7469規範發布時只允許SHA-256演算法。HTTP公鑰固定中的雜湊演算法也可通過RFC 7469規範的附錄A中所提到的命令列或其他第三方工具來生成。[3]
網站維護者可以選擇將特定CA根憑證公鑰固定——只有該CA和其簽發的中階憑證才視同有效,而且可以選擇將一個或多個中階憑證固定,或將末端憑證固定。但是,至少得固定一個備用金鑰以便更換現有的固定金鑰。在沒有備用金鑰(備用金鑰須不在現有憑證鏈中)時,HTTP公鑰固定並不會生效。[4]
HTTP公鑰固定在RFC 7469規範中成為標準。[1]把憑證公鑰的雜湊值寫死在客戶端、瀏覽器中,這被稱為「憑證固定」,HTTP公鑰固定則是「憑證固定」的一種擴充。[5]
Chromium瀏覽器現已經禁止固定自簽章根憑證的憑證鏈,這樣一些內容嗅探、抓包軟體如mitmproxy、Fiddler便無法再利用自簽憑證嗅探加密內容。[6]RFC 7469規範指出,對於此類憑證鏈,建議禁用HTTP公鑰固定的違規回報。[7]
違規回報
客戶端進行HTTP公鑰固定驗證失敗後,將把此次錯誤詳情以JSON格式回報給report-uri
參數中指定的伺服器。若發生客戶端向同域名的伺服器端回報失敗(如違規本身就是由連接問題引起的),伺服器端也可指定另一個域名或採用其他回報服務。[8][9]
瀏覽器支援
Firefox從版本35.0開始支援HPKP[10],Chrome從版本46開始[11]支援,但在Chrome 67中終止了對HPKP的支援[12] 。Internet Explorer、Microsoft Edge目前尚不支援HPKP。[13]
應用現狀
2016年,Netcraft在有關SSL的調研中稱,只有0.09%的憑證在使用HTTP公鑰固定,加上實際運作中不當的組態,實際有效的HTTP公鑰固定憑證數量低於3000。造成這種現象的原因是:該技術尚處於萌芽期,網站技術人員對其缺乏重視和理解,更重要的是,錯誤的部署可能帶來網站方面無法接受的嚴重後果——使用者在相當長一段時間內(取決於max-age
的組態)因新憑證公鑰與舊HPKP策略不符,對網站的合法訪問都將遭拒。[14]
因為網站部署率過低,Google在2018年5月29日發布的Chrome 67中終止了對HPKP的支援。[12]
由Google所主導的憑證透明度提供了一個用於監測、稽核憑證的開放式框架,以保障憑證簽發流程的安全。[15]這是一項和HTTP公鑰固定有著相同目標的較新專案。
參見
- 中間人攻擊
- HTTP嚴格傳輸安全(HTTP Strict Transport Security,HSTS)
- RFC 7469
參考資料
- ^ 1.0 1.1 RFC 7469. tools.ietf.org. Internet Engineering Task Force. [2016-12-04]. (原始內容存檔於2018-01-05) (英語).
- ^ Server and Client Behavior. RFC 7469. Internet Engineering Task Force. [2016-12-04]. (原始內容存檔於2018-01-05) (英語).
- ^ Fingerprint Generation. RFC 7469. Internet Engineering Task Force. [2016-12-04]. (原始內容存檔於2018-01-05) (英語).
- ^ About Public Key Pinning. noncombatant.org. [2015-05-07]. (原始內容存檔於2015-05-15) (英語).
- ^ Certificate and Public Key Pinning - OWASP. www.owasp.org. [2015-05-07]. (原始內容存檔於2015-05-18).
- ^ Security FAQ - The Chromium Projects. www.chromium.org. [2015-07-07]. (原始內容存檔於2015-07-09) (英語).
- ^ Validating Pinned Connections. RFC 7469. Internet Engineering Task Force. [2016-12-04]. (原始內容存檔於2018-01-05) (英語).
- ^ HPKP Violation Reporting. Scott Helme. (原始內容存檔於2015-09-28) (英語).
- ^ Reporting Pin Validation Failure. RFC 7469. Internet Engineering Task Force. [2016-12-04]. (原始內容存檔於2018-01-05) (英語).
- ^ Public Key Pinning. mozilla.org. 2015-12-10 [2015-12-22]. (原始內容存檔於2015-12-04) (英語).
- ^ Rolling out Public Key Pinning with HPKP Reporting. Google Developers. 2016-11-30 [2016-12-05]. (原始內容存檔於2016-12-04) (英語).
- ^ 12.0 12.1 Joseph Medley. Deprecations and removals in Chrome 67. Google Developers. 2017-10-29 [2019-01-05]. (原始內容存檔於2019-03-23) (英語).
- ^ The status of public key pinning extension in Microsoft Edge is under consideration. Microsoft. [2016-12-04]. (原始內容存檔於2016-12-20) (英語).
- ^ Paul Mutton. Secure websites shun HTTP Public Key Pinning. Netcraft. 2016-03-22 [2016-12-04]. (原始內容存檔於2016-12-20) (英語).
- ^ Google透明度报告中的Certificate Transparency. Google. [2016-12-04]. (原始內容存檔於2016-12-20) (中文).