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

2021-02-19 SegmentFault

本文轉載於 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 domainmax-agemax-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 自行查看原文吧。

相關焦點

  • 為什麼我們要使用HTTP Strict Transport Security?
    網站通過HTTP Strict Transport Security通知瀏覽器,這個網站禁止使用HTTP方式加載,瀏覽器應該自動把所有嘗試使用HTTP的請求自動替換為HTTPS請求。0×02.我們為什麼需要開啟Strict-Transport-Security  想想這樣一種場景:有的網站開啟了https,但為了照顧用戶的使用體驗(因為用戶總是很賴的,一般不會主動鍵入https,而是直接輸入域名, 直接輸入域名訪問,默認就是http訪問)同時也支持http訪問,當用戶http訪問的時候,就會返回給用戶一個302重定向,重定向到https的地址,然後後續的訪問都使用
  • 談談HSTS超級Cookie
    HSTS實現的超級Cookie並不是什麼新東西了,去年就有了,只是看到社區裡呆子大神提到了這個東西,所以做一下介紹吧。所謂超級cookie,就是一種客戶端可以保存數據的手段,但是這種手段顯然比cookie更厲害,是可以跨任何域的(這裡根本沒有域的概念了)。具體是怎麼做的呢?
  • 解決缺陷,讓HSTS變得完美
    HSTS是什麼?HSTS是HTTP Strict Transport Security的縮寫,即:「HTTP嚴格傳輸安全」。比如訪問野狗的官網,我們最常使用www.wilddog.com,即使該網站是全站HTTPS ,我們也很少使用https://www.wilddog.com這樣的方式。HTTPS網站的做法是對用戶的HTTP訪問做302跳轉到HTTPS,並重新建連。
  • 巧用客戶端防禦 - 談談HSTS
    http://www.rfc-editor.org/rfc/rfc6797.txthttps://blog.cloudflare.com/enforce-web-policy-with-hypertext-strict-transport-security-hsts/
  • 開啟HSTS讓瀏覽器強制跳轉HTTPS訪問
    瀏覽器廠商們為了解決這個問題,提出了HSTS Preload List方案:內置一份可以定期更新的列表,對於列表中的域名,即使用戶之前沒有訪問過,也會使用HTTPS協議。目前這個Preload List由Google Chrome維護,Chrome、Firefox、Safari、IE 11和Microsoft Edge都在使用。
  • FPGA是什麼?為什麼要使用它?
    例如,比特幣挖礦,就有使用基於FPGA的礦機。還有,之前微軟表示,將在數據中心裡,使用FPGA「代替」CPU,等等。其實,對於專業人士來說,FPGA並不陌生,它一直都被廣泛使用。但是,大部分人還不是太了解它,對它有很多疑問——FPGA到底是什麼?為什麼要使用它?相比 CPU、GPU、ASIC(專用晶片),FPGA有什麼特點?今天,帶著這一系列的問題,我們一起來——揭秘FPGA。
  • 什麼是著陸頁面,以及為什麼要使用它
    95%以上都會使用著陸頁,很少使用直鏈,很多人會這樣想製作著陸頁非常麻煩,還要買伺服器託管,而且中間多了一步如果有的人沒有點擊著陸頁的按鈕,一些流量不就流失了嗎?這不是多此一舉嗎?所以很多人選擇不用著陸頁,然後過來問我,為什麼我的Offer沒轉化。
  • HSTS原理及實踐
    網站一旦啟用HSTS策略,瀏覽器會強制使用HTTPS網站進行通信,以減少會話劫持風險。伺服器開啟HSTS的方法很簡單。當瀏覽器發起Https請求的時候,在響應頭中增加Strict-Transport-Security欄位。
  • HTTP Strict Transport Security (HSTS) in ASP.NET Core
    HSTS指示瀏覽器只能使用HTTPS訪問域名,來處理潛在的中間人劫持風險。即使用戶輸入或使用普通的HTTP連接,瀏覽器也嚴格將連接升級到HTTPS。HTTPS發起連接,這個列表由Chrome維護,主流瀏覽器均在使用。
  • HTTP HSTS協議和 nginx
    什麼是HSTSHTTPS(SSL和TLS)確保用戶和網站通訊過程中安全,使攻擊者難於攔截、修改和假冒。當用戶手動輸入域名或http://連結,該網站的第一個請求是未加密的,使用普通的http。最安全的網站立即發送回一個重定向使用戶引向到https連接,然而,中間人攻擊者可能會攻擊攔截初始的http請求,從而控制用戶後續的回話。
  • HSTS 詳解,讓 HTTPS 更安全
    如果僅使用 HTTPS 協議,雖然它也會提醒訪問的網站的安全性存在問題,但依然可以通過忽略危險進行訪問。使用 HSTS 策略後,瀏覽器會終止任何和所有安全傳輸錯誤或警告的任何安全傳輸連接嘗試。也就不能忽略瀏覽器的不安全提示,無法進行不安全的訪問連接,從而進一步保證用戶的數據安全。
  • 作為 HTTPS 的骨灰粉,怎麼可以不加入 HSTS 預載入列表
    HSTS 是什麼?如果一個 web 伺服器支持 HTTP 訪問,並將其重定向到 HTTPS 訪問的話,那麼訪問者在重定向前的初始會話是非加密的。舉個例子,比如訪問者輸入 http://www.foo.com/ 或直接輸入 foo.com 時。這就給了中間人攻擊的一個機會,重定向可能會被破壞,從而定向到一個惡意站點而不是應該訪問的加密頁面。
  • 什麼是Python Wheels?為什麼要關心它?
    如果您已經使用pip安裝了Python包,那麼很有可能是輪子(wheels)使安裝速度更快、效率更高了。輪子是Python生態系統的一個組件,它有助於使包的安裝工作正常進行。它們允許更快的安裝和更穩定的包分發過程。在本教程中,您將深入了解輪子是什麼,它們提供了什麼好處,以及它們是如何獲得吸引力並使使用Python變得更方便的。
  • One Hot編碼是什麼?為什麼要用它,什麼時候用它?
    你可以看到一個one hot編碼器的sklearn文檔,其中說「使用one-hot也就是one-of- k模式編碼分類整數特徵」。不是很清楚,對吧?或者至少不適合我。讓我們看看one hot編碼到底是什麼。One hot編碼方法是將分類變量轉換成一種形式,這種形式可以提供給ML算法,以便更好地進行預測。
  • 什麼是Python人工智慧?​為什麼要學它?
    2011年1月,它被TIOBE程式語言排行榜評為2010年度語言。2004年以後,python的使用率呈線性增長。無論是只有十幾個人的小公司,還是大如新浪、網易、百度、阿里、騰訊、谷歌、紅帽等網際網路巨頭企業,都選擇Python作為最關鍵的開發語言!
  • Likee是什麼?為什麼要關注它
    一、Likee是什麼?
  • Firebase 是什麼,為什麼要學習它?
    什麼是Firebase?Firebase是2011年由Firebase公司開發的移動和Web應用開發平臺,後於2014年被谷歌收購。截至2018年10月,Firebase平臺共有18款產品,有150萬個App使用。根據維基百科的定義)。
  • 什麼是Signal?為什麼大家都開始使用它?
    要明確一點,Signal 可不是突然憑空冒出來的。實際上,它早在2013年就被開發完成。長期以來,它被小範圍的隱私倡導者所使用。愛德華·斯諾登曾在2015年認可Signal的安全性。你會感到好奇,究竟是什麼將Signal推上了「風口浪尖」?
  • 為什麼要使用函數
    函數是什麼函數,即實現一個特定功能的代碼段。是python中的重要技能(工具)。函數離我們並不遠,早期我們已熟練使用了一些內置函數:例如input print等;根據使用範圍可以將函數分為兩類:主函數我們會使用這樣來表示,它和代碼一樣,全局都是使用;01 if _name_ = '_main_':02     print('This is main.')
  • Node.js 是什麼?我為什麼選擇它?
    它是什麼?能做什麼或者換句話說,能解決什麼問題?沒有一樣東西是最好的,是可以替代所有的,但在某一領域它是最適合的,正如 Node.js 它可能是某些程式設計師苦苦追尋的東西,也可能是某些程式設計師不會去關心的東西。本文主要為您介紹 Node.js 的背景及它能做什麼,擅長什麼,不會涉及到複雜的代碼層面的知識講解,如果你覺得自己很熟悉了,也可以忽略它。