使用 HPKP 報告功能推出綁定公開金鑰

Emily Stark

為了保障使用者的安全和隱私,在網站中使用 SSL 至關重要。 不過,啟用 SSL 並不是最後的工作機會。您可以採取許多措施來進一步強化網站的安全性,包括在 Cookie 設定安全屬性、開啟 HTTP 嚴格傳輸安全性、使用內容安全政策,以及鎖定網站權限等。不過,部署這些強大的功能有時可能會不太容易。為協助您推出更嚴格的安全資料傳輸層,Chrome 46 搭載 HPKP 報告功能。

這些縮寫是什麼意思?

現今的網路安全性仰賴安全資料傳輸層 (SSL) 憑證,也就是經過加密編譯的簽章,能證明網站的身分來自網站。瀏覽器向 https://developers.google.com 之類的網址發出要求時,伺服器會提供安全資料傳輸層 (SSL) 憑證,如果憑證有效,瀏覽器就會允許要求進行後續步驟,並在網址列中顯示包含綠色鎖頭的網站網址。

什麼是有效的憑證?憑證必須由憑證授權單位 (CA) 或其他由 CA 簽署的憑證 (稱為中繼 CA) 簽署,才算有效。瀏覽器和作業系統上有數百個可核發憑證的憑證授權單位清單。不過,問題是,根據預設,這些 CA 都能為「任何」網站核發憑證。如果其中一部裝置遭到入侵或出現不當行為,就會對整個網路造成危害。

請輸入 HTTP 公開金鑰 PIN 碼,或 HPKP。這項標準允許網站傳送 HTTP 標頭,指示瀏覽器記住 (或「固定」) 其 SSL 憑證鏈結的部分。如果後續連線與先前收到的 PIN 碼不相符,瀏覽器就會拒絕以下是 HPKP 標頭的範例:

Public-Key-Pins:  
       pin-sha256="d6qzRu9zOECb90Uez27xWltNsj0e1Md7GkYYkVoZWmM=";  
       pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=";  
       max-age=259200

這個標頭可指定兩個憑證雜湊做為 PIN 碼。一個是網站憑證鏈中的憑證雜湊,另一個則是備用 PIN 碼,網站可在需要輪替憑證時使用備用 PIN 碼或憑證雜湊。標頭中也包含 max-age 值。過了幾秒後,瀏覽器就會忘記 PIN 碼。

如要進一步瞭解 HPKP 的一般資訊,請參閱規格或其他 Chrome 開發人員 Chris Palmer 撰寫的優質網誌文章

請問要立即開啟 HPKP 嗎?

不一定。部署 HPKP 時,很容易會出錯並誤點 DoS 您的網站。如果您將網站固定使用一組憑證,接著必須部署新的憑證,則已經看到 PIN 碼的使用者就無法存取您的網站 (根據標頭中的 max-age 值)。

要找出正確的做法可能並不容易,因此 HPKP 目前大多用於幾個容易維護安全性的 高知名度網站。如果您決定開啟 HPKP,一開始可以使用極短的 max-age 值,如果沒有任何問題,則逐步增加該值。

什麼是 HPKP 報告?這類功能有什麼幫助?

Chrome 46 推出 HPKP 報告功能,可讓您在推出 HPKP 時偵測錯誤設定。

首先,您可以傳送 Public-Key-Pins-Report-Only 標頭,而非 Public-Key-Pins 標頭:

Public-Key-Pins-Report-Only: 
       max-age=2592000;  
       pin-sha256="E9CZ9INDbd+2eRQozYqqbQ2yXLVKB9+xcprMF+44U1g=";  
       pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=";  
report-uri="https://example.net/pkp-report"

當網站傳送這類標頭時,Chrome 會確認目前的連線與 PIN 碼是否相符,並在不相符的情況下將報告傳送至 report-uri。Chrome 絕對不會封鎖根據 Report-Only 標頭中的圖釘提出的要求,因此您可以安全地試用 HPKP,看看這樣是否會對使用者造成問題,而不會對網站執行 DoSing 的風險。

請注意,「僅限報表」標頭僅適用於接收請求。瀏覽器不會記住「僅限報告」的圖釘,它是實際圖釘。這樣一來,您就能測試設定而不必擔心將使用者的瀏覽器快取錯誤值。此外,您也可以逐步推出 (例如只針對單一資源) 推出,避免伺服器過多的報表過多。

當您推出真正的 Public-Key-Pins 標頭,開始強制執行 PIN 碼時,您也可以在標頭中加入 report-uri 值,這樣您就能在發生問題時繼續收到報告。

HPKP 違規報告有哪些內容?

HPKP 違規報表是透過 HTTP POST 要求傳送至您設定的 report-uri 的 JSON 訊息。您可在spec中找到欄位清單,但我們在此特別介紹其中兩個:served-certificate-chainvalidated-certificate-chainserved-certificate-chain 是 Chrome 在設定要求的 SSL 連線時所收到的憑證。另一方面,validated-certificate-chain 則是 Chrome 在嘗試驗證伺服器憑證時重新建構的鏈結,幸好與 served-certificate-chain 不同。不同的用戶端會以不同的方式執行憑證驗證,而這可能是 HPKP 設定錯誤的常見原因。如果您收到非預期的報表,請務必檢查這個欄位。

最後一個「gotcha」

如果您部署 HPKP 報告,Chrome 會對所有要求 (包括報告傳送要求) 進行固定驗證。因此,如果您已為網站部署 HPKP,您可能會想將 HPKP 報表傳送至尚未固定的其他網域。否則,網站上的 PIN 碼違規時,同樣會導致檢舉失敗的違規網址,您也不會收到這類報告。

如果您沒有其他網域,可以改用 report-uri.io 這類服務處理違規檢舉。