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

Emily Stark

在網站上使用 SSL 是保護使用者安全和隱私的重要方式。不過,啟用 SSL 只是第一步,您還可以採取許多措施,進一步強化網站安全性,例如在 Cookie 上設定 Secure 屬性、啟用 HTTP 嚴格傳輸安全性,以及使用內容安全政策鎖定網站權限。不過,部署這些強大功能有時可能相當棘手。為協助您推出更嚴格的 SSL 形式,Chrome 46 隨附一項名為 HPKP 報告的功能。

這些縮寫代表什麼意思?

現今的網路安全仰賴 SSL 憑證:加密簽章證明網站的身分。當瀏覽器向網址 (例如 https://developers.google.com) 傳送要求時,伺服器會提供 SSL 憑證,如果憑證有效,瀏覽器會允許要求繼續進行,並在網址列中顯示網站網址和綠色掛鎖。

不過,什麼是有效憑證?憑證必須由憑證授權單位 (CA) 簽署,或由 CA 簽署的其他憑證 (稱為中繼 CA) 簽署,才算有效。瀏覽器和作業系統會隨附一份清單,列出數百個受信任的 CA,可核發憑證。不過,問題在於根據預設,這些 CA 都可以為任何網站核發憑證。如果其中任何一個遭到入侵或行為不當,可能會對整個網路造成毀滅性的影響。

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

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

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

如要進一步瞭解 HPKP,請參閱規格或 Chrome 開發人員 Chris Palmer 的網誌文章。

我應該立即啟用 HPKP 嗎?

不一定。部署 HPKP 時,很容易出錯,並意外對網站造成阻斷服務。如果您將網站固定到一組憑證,然後必須部署新憑證,則看過固定憑證的使用者將無法存取您的網站,直到固定憑證到期為止 (根據標頭中的 max-age 值)。

由於 HPKP 難以正確設定,目前大多只有少數知名且重視安全性的網站使用。如果您決定啟用 HPKP,請先設定極短的 max-age 值,如果沒有任何問題,再逐漸增加。

什麼是 HPKP 回報功能?這項功能有何幫助?

HPKP 回報功能 (Chrome 46 推出) 可在您推出 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 會驗證目前連線是否與固定項目相符,如果不符,就會傳送報告至 report-uri。Chrome 絕不會根據 Report-Only 標頭中的固定憑證封鎖要求,因此您可以放心試用 HPKP,看看是否會對使用者造成問題,不必擔心網站會遭到阻斷服務攻擊。

請注意,Report-Only 標頭僅適用於收到該標頭的要求。瀏覽器不會像記住實際固定碼一樣記住 Report-Only 固定碼。這樣一來,您就能測試設定,不必擔心在使用者瀏覽器中快取錯誤的值,而且可以逐步推出 (例如只在單一資源上),避免伺服器收到大量報告。

當您推出實際的 Public-Key-Pins 標頭,開始強制執行固定憑證時,也可以在該標頭中加入 report-uri 值,這樣一來,如果發生任何問題,您就會繼續收到報告。

HPKP 違規報告包含哪些內容?

HPKP 違規報告是以 JSON 訊息的形式,透過 HTTP POST 要求傳送至您設定的 report-uri。您可以在規格中找到欄位清單,但這裡會特別介紹其中兩個:served-certificate-chain 和 validated-certificate-chain。served-certificate-chain 是 Chrome 在為要求設定 SSL 連線時收到的憑證。另一方面,validated-certificate-chain 是 Chrome 嘗試驗證伺服器憑證時重建的鏈結,令人驚訝的是,這可能與 served-certificate-chain 不同。不同用戶端會以不同方式驗證憑證,這可能是 HPKP 設定錯誤的常見原因。如果您收到非預期的報表,請務必檢查這個欄位。

最後一個「陷阱」

如果您要部署 HPKP 報告,請注意 Chrome 會驗證所有要求的固定設定,包括傳送報告的要求。因此,如果您已為網站部署 HPKP,建議您將 HPKP 報表傳送至未固定的其他網域。否則,網站上的固定違規行為會觸發傳送至相同網域的報告,這也會導致固定違規行為失敗,因此您不會收到報告。

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