什麼是HSTS,為什麼要使用它?

Pines_Cheng發表於2020-04-16

image

翻譯自:What Is HSTS and Why Should I Use It?

作者:Tomasz Andrzej Nidecki,一位非常專業的 Technical Content Writer ,目前是 Acunetix 的技術內容撰寫人,他是一名擁有 25 年 IT 經驗的記者、翻譯和技術撰稿人,Tomasz 早年曾擔任《 hakin9 IT Security 》雜誌的總編輯,並曾經運營過一個專門針對電子郵件安全的主要技術部落格。

HSTS 是 HTTP 嚴格傳輸安全(HTTP Strict Transport Security) 的縮寫。 這是一種網站用來宣告他們只能使用安全連線(HTTPS)訪問的方法。 如果一個網站宣告瞭 HSTS 策略,瀏覽器必須拒絕所有的 HTTP 連線並阻止使用者接受不安全的 SSL 證書。 目前大多數主流瀏覽器都支援 HSTS (只有一些移動瀏覽器無法使用它)。

image

在 2012 年的 RFC 6797 中,HTTP嚴格傳輸安全被定義為網路安全標準。 建立這個標準的主要目的,是為了避免使用者遭受使用 SSL stripping(剝離) 的 中間人攻擊(man-in-The-middle,MITM)。 SSL stripping 是一種攻擊者強迫瀏覽器使用 HTTP 協議連線到站點的技術,這樣他們就可以嗅探資料包,攔截或修改敏感資訊。 另外,HSTS 也是一個很好的保護自己免受 cookie 劫持(cookie hijacking)的方法。

HSTS 工作原理

通常,當您在 Web 瀏覽器中輸入 URL 時,您會跳過協議部分。 例如,你輸入的是 www.acunetix.com,而不是 http://www.acunetix.com。 在這種情況下,瀏覽器假設你想使用 HTTP 協議,所以它在這個階段發出一個 HTTP 請求www.acunetix.com,同時,Web Server 會返回 301 狀態碼將請求重定向到 HTTPS 站點。 接下來瀏覽器使用 HTTPS 連線到 www.acunetix.com。 這時 HSTS 安全策略保護開始使用 HTTP 響應頭:

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

響應頭的 Strict-Transport-Security 給瀏覽器提供了詳細的說明。 從現在開始,每個連線到該網站及其子域的下一年(31536000秒)從這個頭被接收的時刻起必須是一個 HTTPS 連線。 HTTP 連線是完全不允許的。 如果瀏覽器接收到使用 HTTP 載入資源的請求,則必須嘗試使用 HTTPS 請求替代。 如果 HTTPS 不可用,則必須直接終止連線

此外,如果證書無效,將阻止你建立連線。 通常來說,如果 HTTPS 證書無效(如:過期、自簽名、由未知 CA 簽名等),瀏覽器會顯示一個可以規避的警告。 但是,如果站點有 HSTS,瀏覽器就不會讓你繞過警告。 若要訪問該站點,必須從瀏覽器內的 HSTS 列表中刪除該站點

響應頭的 Strict-Transport-Security 是針對一個特定的網站傳送的,並且覆蓋一個特定的域名(domain)。 因此,如果你有 HSTS 的 www.acunetix.com ,它不會覆蓋 acunetix. com,而只覆蓋 www 子域名。 這就是為什麼,為了完全的保護,你的網站應該包含一個對 base domain 的呼叫(在本例中是 acunetix. com) ,並且接收該域名的 Strict-Transport-Security 頭和 includeSubDomains 指令。

image

HSTS 是否完全安全?

不幸的是,你第一次訪問這個網站,你不受 HSTS 的保護。 如果網站向 HTTP 連線新增 HSTS 頭,則該報頭將被忽略。 這是因為攻擊者可以在中間人攻擊(man-in-the-middle attack)中刪除或新增頭部。 HSTS 報頭不可信,除非它是通過 HTTPS 傳遞的。

你還應該知道,每次您的瀏覽器讀取 header 時,HSTS max-age 都會重新整理,最大值為兩年。 這意味著保護是永久性的,只要兩次訪問之間不超過兩年。 如果你兩年沒有訪問一個網站,它會被視為一個新網站。 與此同時,如果你提供 max-age 0 的 HSTS header,瀏覽器將在下一次連線嘗試時將該站點視為一個新站點(這對測試非常有用)。

你可以使用稱為 HSTS 預載入列表(HSTS preload list)的附加保護方法。 Chromium 專案維護一個使用 HSTS 的網站列表,該列表通過瀏覽器釋出。 如果你把你的網站新增到預載入列表中,瀏覽器會首先檢查內部列表,這樣你的網站就永遠不會通過 HTTP 訪問,甚至在第一次連線嘗試時也不會。 這個方法不是 HSTS 標準的一部分,但是它被所有主流瀏覽器(Chrome、 Firefox、 Safari、 Opera、 IE11 和 Edge)使用。

目前唯一可用於繞過 HSTS 的已知方法是基於 NTP 的攻擊。 如果客戶端計算機容易受到 NTP 攻擊( NTP-based attack),它可能會被欺騙,使 HSTS 策略到期,並使用 HTTP 訪問站點一次。

如何將域名新增到 HSTS 預載入列表?

要將域新增到 HSTS 預載入列表,該域的站點必須滿足幾個要求。 以下是新增域名所需的步驟:

  1. 確保你的網站擁有有效的證書和最新的密碼
  2. 如果你的網站可以通過 HTTP 訪問,請將所有請求重定向到 HTTPS
  3. 確保以上第 1 點和第 2 點適用於你的所有域名和子域名(根據您的 DNS 記錄)
  4. 通過 HTTPS 服務返回 Strict-Transport-Security header ,帶上 base domainmax-agemax-age 至少為31536000 (1 年),另外還有 includeSubDomains 指令和 preload 指令。 可以參考上面的 HSTS header。
  5. 訪問 hstspreload.org ,並使用表格提交你的域名。如果符合條件,您的域名將被加入佇列。

為了提高安全性,瀏覽器不能訪問或下載 預載入列表(preload list)。 它作為硬編碼資源(hard-coded resource)和新的瀏覽器版本一起分發。 這意味著結果出現在列表中需要相當長的時間,而域從列表中刪除也需要相當長的時間。 如果你希望將你的站點新增到列表中,則必須確保您能夠在較長時間內保持對所有資源的完全 HTTPS 訪問。 如果不這樣做,你的網站可能會完全無法訪問

就像這樣:
image

如何從瀏覽器的 HSTS 快取中刪除域?

在設定 HSTS 並測試它時,可能需要清除瀏覽器中的 HSTS 快取。 如果你設定 HSTS 不正確,你可能會訪問網站出錯,除非你清除資料。 下面是幾種常用瀏覽器的方法。 還要注意,如果你的域在 HSTS 預載入列表中,清除 HSTS 快取將是無效的,並且無法強制進行 HTTP 連線。

要從 Chrome HSTS 快取中刪除一個域名,請按照以下步驟操作:

  1. 訪問 chrome://net-internals/#hsts
  2. Delete domain security policies下的文字框中輸入要刪除的域
  3. 點選文字框旁邊的 Delete 按鈕

image

之後,你可以檢查移除是否成功:

  1. Query HSTS/PKP domain 下的文字框中輸入要驗證的域
  2. 點選文字框旁邊的 Query 按鈕
  3. 返回應該是 not found

image

Mozilla Firefox 、Safari 和 Microsoft Edge 自行檢視原文吧。

相關文章