在網站上使用 SSL 是保護使用者安全性和隱私權的重要方式。不過,啟用 SSL 並非結束,您可以採取許多步驟進一步提升網站的安全性,包括在 Cookie 上設定 Secure 屬性、開啟 HTTP 嚴格傳輸安全性,以及使用 內容安全性政策來鎖定網站的權限。不過,部署這些強大功能有時可能會有些棘手。為協助你推出更嚴格的 SSL 形式,Chrome 46 提供名為 HPKP 回報的功能。
這些縮寫字詞有什麼意義?
如今,網路安全性仰賴 SSL 憑證:加密簽名可證明網站的真實身分。當瀏覽器向 https://developers.google.com 等網址傳送要求時,伺服器會提供 SSL 憑證,如果憑證有效,瀏覽器就會允許要求繼續執行,並在網址列中顯示網站網址和綠色鎖頭。
不過,什麼是有效的憑證?憑證必須由憑證授權單位 (CA) 簽署,或是由 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
值。秒數到期後,瀏覽器就會忘記 PIN 碼。
如要進一步瞭解 HPKP 的一般資訊,請參閱規格說明或 Chrome 開發人員 Chris Palmer 撰寫的優質網誌文章。
我現在應該開啟 HPKP 嗎?
不一定。部署 HPKP 時,很容易出錯,導致網站遭到 DoS 攻擊。如果您將網站綁定至一組憑證,然後必須部署新的憑證,則在綁定憑證到期前,曾看過綁定憑證的使用者將無法存取您的網站 (依據標頭中的 max-age
值而定)。
由於 HPKP 的使用方式相當複雜,目前只有少數高知名度、安全性敏感的網站會使用這項功能。如果您決定啟用 HPKP,建議您先採用極短的最大年齡值,如果沒有任何問題,再逐漸提高。
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 會驗證目前的連線是否與綁定相符,如果不相符,就會傳送報告給 report-uri
。Chrome 絕不會根據「Report-Only」標頭中的固定資料封鎖要求,因此這是測試 HPKP 的安全方法,可讓您瞭解 HPKP 是否會對使用者造成問題,而不會讓網站遭到 DoS 攻擊的風險。
請注意,Report-Only 標頭只會套用至收到該標頭的要求。瀏覽器不會像記住實際的圖釘一樣記住「僅供報表使用」圖釘。這樣一來,您就能測試設定,而不必擔心在使用者的瀏覽器中快取錯誤值,而且您可以逐步推出 (例如只針對單一資源),避免讓伺服器淹沒報表。
當您推出實際的 Public-Key-Pins
標頭,開始強制使用固定資料時,也可以在該標頭中加入 report-uri 值,這樣在發生任何問題時,您就能繼續收到報表。
HPKP 違規報告的內容
HPKP 違規報告是透過 HTTP POST 要求傳送至已設定 report-uri
的 JSON 訊息。您可以在規格中找到欄位清單,但我會在此處強調其中兩個欄位:served-certificate-chain
和 validated-certificate-chain
。served-certificate-chain
是 Chrome 為要求設定 SSL 連線時收到的憑證。另一方面,validated-certificate-chain
是 Chrome 在嘗試驗證伺服器憑證時重建的鏈結,而這可能與 served-certificate-chain
不同。不同的用戶端會以不同方式執行憑證驗證,這可能是 HPKP 設定錯誤的常見原因。如果收到不尋常的報表,請務必勾選這個欄位。
最後一個「gotcha」
如果您要部署 HPKP 回報功能,請注意,Chrome 會為所有要求 (包括回報傳送要求) 進行 PIN 驗證。因此,如果您已為網站部署 HPKP,可能會想要將 HPKP 報表傳送至未固定的其他網域。否則,你的網站上的圖釘違規行為會觸發對同一網域的報表,而該網域也會因圖釘違規而失敗,因此你不會收到報表。
如果沒有其他網域可用,您可以改用 report-uri.io 等服務,由這些服務處理違規檢舉。