本文轉載於 SegmentFault 社區
作者:Pines_Cheng
翻譯自: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 (只有一些移動瀏覽器無法使用它)。
在 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 指令。
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 預加載列表,該域的站點必須滿足幾個要求。以下是添加域名所需的步驟:
確保你的網站擁有有效的證書和最新的密碼
如果你的網站可以通過 HTTP 訪問,請將所有請求重定向到 HTTPS
確保以上第 1 點和第 2 點適用於你的所有域名和子域名(根據您的 DNS 記錄)
通過 HTTPS 服務返回 Strict-Transport-Security header ,帶上 base domain 和 max-age ,max-age 至少為31536000 (1 年),另外還有 includeSubDomains 指令和 preload 指令。可以參考上面的 HSTS header。
訪問 hstspreload.org ,並使用表格提交你的域名。如果符合條件,您的域名將被加入隊列。
為了提高安全性,瀏覽器不能訪問或下載 預加載列表(preload list)。它作為硬編碼資源(hard-coded resource)和新的瀏覽器版本一起分發。這意味著結果出現在列表中需要相當長的時間,而域從列表中刪除也需要相當長的時間。如果你希望將你的站點添加到列表中,則必須確保您能夠在較長時間內保持對所有資源的完全 HTTPS 訪問。如果不這樣做,你的網站可能會完全無法訪問。
就像這樣:
如何從瀏覽器的 HSTS 緩存中刪除域?
在設置 HSTS 並測試它時,可能需要清除瀏覽器中的 HSTS 緩存。如果你設置 HSTS 不正確,你可能會訪問網站出錯,除非你清除數據。下面是幾種常用瀏覽器的方法。還要注意,如果你的域在 HSTS 預加載列表中,清除 HSTS 緩存將是無效的,並且無法強制進行 HTTP 連接。
要從 Chrome HSTS 緩存中刪除一個域名,請按照以下步驟操作:
訪問 chrome://net-internals/#hsts
在 Delete domain security policies下的文本框中輸入要刪除的域
點擊文本框旁邊的 Delete 按鈕
之後,你可以檢查移除是否成功:
在 Query HSTS/PKP domain 下的文本框中輸入要驗證的域
點擊文本框旁邊的 Query 按鈕
返回應該是 not found
Mozilla Firefox 、Safari 和 Microsoft Edge 自行查看原文吧。