翻譯自: What Is HSTS and Why Should I Use It?做者:Tomasz Andrzej Nidecki,一位很是專業的 Technical Content Writer ,目前是 Acunetix 的技術內容撰寫人,他是一名擁有 25 年 IT 經驗的記者、翻譯和技術撰稿人,Tomasz 早年曾擔任《 hakin9 IT Security 》雜誌的總編輯,並曾經運營過一個專門針對電子郵件安全的主要技術博客。html
HSTS 是 HTTP 嚴格傳輸安全(HTTP Strict Transport Security) 的縮寫。 這是一種網站用來聲明他們只能使用安全鏈接(HTTPS)訪問的方法。 若是一個網站聲明瞭 HSTS 策略,瀏覽器必須拒絕全部的 HTTP 鏈接並阻止用戶接受不安全的 SSL 證書。 目前大多數主流瀏覽器都支持 HSTS (只有一些移動瀏覽器沒法使用它)。chrome
在 2012 年的 RFC 6797 中,HTTP嚴格傳輸安全被定義爲網絡安全標準。 建立這個標準的主要目的,是爲了不用戶遭受使用 SSL stripping(剝離) 的 中間人攻擊(man-in-The-middle,MITM)。 SSL stripping 是一種攻擊者強迫瀏覽器使用 HTTP 協議鏈接到站點的技術,這樣他們就能夠嗅探數據包,攔截或修改敏感信息。 另外,HSTS 也是一個很好的保護本身免受 cookie 劫持(cookie hijacking)的方法。瀏覽器
一般,當您在 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 列表中刪除該站點。cookie
響應頭的 Strict-Transport-Security
是針對一個特定的網站發送的,而且覆蓋一個特定的域名(domain)。 所以,若是你有 HSTS 的 www.acunetix.com
,它不會覆蓋 acunetix. com
,而只覆蓋 www
子域名。 這就是爲何,爲了徹底的保護,你的網站應該包含一個對 base domain 的調用(在本例中是 acunetix. com) ,而且接收該域名的 Strict-Transport-Security
頭和 includeSubDomains
指令。網絡
不幸的是,你第一次訪問這個網站,你不受 HSTS 的保護。 若是網站向 HTTP 鏈接添加 HSTS 頭,則該報頭將被忽略。 這是由於攻擊者能夠在中間人攻擊(man-in-the-middle attack)中刪除或添加頭部。 HSTS 報頭不可信,除非它是經過 HTTPS 傳遞的。dom
你還應該知道,每次您的瀏覽器讀取 header 時,HSTS max-age
都會刷新,最大值爲兩年。 這意味着保護是永久性的,只要兩次訪問之間不超過兩年。 若是你兩年沒有訪問一個網站,它會被視爲一個新網站。 與此同時,若是你提供 max-age
0 的 HSTS header,瀏覽器將在下一次鏈接嘗試時將該站點視爲一個新站點(這對測試很是有用)。ide
你可使用稱爲 HSTS 預加載列表(HSTS preload list)的附加保護方法。 Chromium 項目維護一個使用 HSTS 的網站列表,該列表經過瀏覽器發佈。 若是你把你的網站添加到預加載列表中,瀏覽器會首先檢查內部列表,這樣你的網站就永遠不會經過 HTTP 訪問,甚至在第一次鏈接嘗試時也不會。 這個方法不是 HSTS 標準的一部分,可是它被全部主流瀏覽器(Chrome、 Firefox、 Safari、 Opera、 IE11 和 Edge)使用。測試
目前惟一可用於繞過 HSTS 的已知方法是基於 NTP 的攻擊。 若是客戶端計算機容易受到 NTP 攻擊( NTP-based attack),它可能會被欺騙,使 HSTS 策略到期,並使用 HTTP 訪問站點一次。
要將域添加到 HSTS 預加載列表,該域的站點必須知足幾個要求。 如下是添加域名所需的步驟:
Strict-Transport-Security
header ,帶上 base domain
和 max-age
,max-age
至少爲31536000 (1 年),另外還有 includeSubDomains
指令和 preload
指令。 能夠參考上面的 HSTS header。爲了提升安全性,瀏覽器不能訪問或下載 預加載列表(preload list)。 它做爲硬編碼資源(hard-coded resource)和新的瀏覽器版本一塊兒分發。 這意味着結果出如今列表中須要至關長的時間,而域從列表中刪除也須要至關長的時間。 若是你但願將你的站點添加到列表中,則必須確保您可以在較長時間內保持對全部資源的徹底 HTTPS 訪問。 若是不這樣作,你的網站可能會徹底沒法訪問。
就像這樣:
在設置 HSTS 並測試它時,可能須要清除瀏覽器中的 HSTS 緩存。 若是你設置 HSTS 不正確,你可能會訪問網站出錯,除非你清除數據。 下面是幾種經常使用瀏覽器的方法。 還要注意,若是你的域在 HSTS 預加載列表中,清除 HSTS 緩存將是無效的,而且沒法強制進行 HTTP 鏈接。
要從 Chrome HSTS 緩存中刪除一個域名,請按照如下步驟操做:
chrome://net-internals/#hsts
Delete domain security policies
下的文本框中輸入要刪除的域以後,你能夠檢查移除是否成功:
Query HSTS/PKP domain
下的文本框中輸入要驗證的域Mozilla Firefox 、Safari 和 Microsoft Edge 自行查看原文吧。