在網站上使用 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 報表是什麼?有何幫助?
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 的安全方法,可讓您瞭解 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 等服務,由服務處理違規檢舉。