HTTP嚴格傳輸安全協議 (HSTS)

HSTS

HTTP協議最初經過TCP傳輸,後爲了傳輸安全,加入了SSL/TLS做爲中間層,稱爲HTTPS(HTTP over SSL)。當在瀏覽器中輸入一個域名訪問時,瀏覽器默認會經過HTTP協議訪問服務器,服務端能夠返回301以跳轉到HTTPS,此後全部數據傳輸經過HTTPS傳輸。然而,中間人攻擊者可能會攻擊攔截初始的http請求,從而控制用戶後續的回話。html

HTTP Strict Transport Security,即HSTS協議提供了一個機制,讓服務端能夠主動告知瀏覽器,之後的請求所有嚴格地經過HTTPS進行。web

HSTS如何工做

啓用HSTS

服務端向瀏覽器發送響應時,能夠在響應頭部中添加Strict-Transport-Security,告知瀏覽器開啓HSTS。chrome

如響應頭部中有Strict-Transport-Security: max-age=86400表示爲當前域名啓用HSTS,過時時間爲1天。瀏覽器

如響應頭部中有Strict-Transport-Security: max-age=259200; includeSubDomains表示爲當前域名和全部的子域名啓用HSTS,過時時間爲30天。安全

Tips服務器

  • 只有在安全傳輸中Strict-Transport-Security頭部纔會生效。在HTTP(而不是HTTPS)中Strict-Transport-Security頭部會被忽略
  • max-age的值爲TTL(即生存時間),值爲0時(例如Strict-Transport-Security: max-age=0)瀏覽器將關閉此域名的HSTS設置

瀏覽器自動跳轉HTTPS

對於開啓了HSTS的域名,瀏覽器將強制採用HTTPS。dom

1. 直接訪問域名時跳轉

在瀏覽器中訪問域名時,若是域名開啓了HSTS,瀏覽器將發生內部跳轉,直接跳轉到HTTPS進行訪問。即便用戶手動輸入http://domainname訪問,仍會發生強制跳轉。google

2. 網頁中的連接跳轉

網頁中的資源,若是其URL的域名啓用了HSTS,瀏覽器請求此資源時將自動跳轉的HTTPS。 如網頁中有連接<img src="http://qlee.in/static/logo.img>,並且qlee.in開啓了HSTS,瀏覽器將自動到https://qlee.in/static/logo.img請求相應的資源。firefox

3. 端口的處理

HTTP默認採用80端口,HTTPS默認採用443端口。當瀏覽器由於HSTS執行內部跳轉時code

  • 1 若是沒有顯式指定端口,瀏覽器跳轉時也不會顯式指定端口,默認HTTPS會訪問443端口
  • 2 若是指定了80端口,瀏覽器跳轉時會將端口轉換爲443端口
  • 3 若是指定了其餘端口,瀏覽器跳轉時會保留指定的端口

HSTS對SSL鏈接的影響

HSTS中的Strict不僅是強制跳轉到HTTPS,也包含了對HTTPS鏈接創建的處理。開啓HSTS後,一旦有警告或者錯誤,瀏覽器將直接關閉HTTPS鏈接。包括如下幾種

  1. SSL證書過時或者驗證失敗。沒有開啓HSTS時,一旦遇到證書過時、域名不匹配、簽名驗證失敗等狀況,瀏覽器將要求用戶選擇是否繼續。而開啓HSTS後,瀏覽器將關閉鏈接,沒法繼續訪問。
  2. 證書經過OCSP或CRLs等方式被撤銷。

取消HSTS

1. 服務器端關閉HSTS

服務端能夠經過響應的添加頭部Strict-Transport-Security: max-age=0或者Strict-Transport-Security: max-age=0; includeSubDomains來告知瀏覽器關閉域名的HSTS

2. 瀏覽器端關閉HSTS

對於chrome瀏覽器,地址欄中輸入chrome://net-internals/#hsts進入HSTS設置頁面,能夠查詢、刪除指定域名的HSTS設置,也能夠手動爲域名開啓HSTS。

對於chrome和firefox瀏覽器,能夠經過刪除域名的歷史記錄來清除域名的HSTS設置。

HSTS preload list

google維護了一個稱爲「HSTS preload list」的站點域名和子域名列表,主流的web瀏覽器(Chrome, Firefox, Opera, Safari, IE 11 and Edge) 都採用了該域名列表,對列表中的域名強制開啓HSTS。域名的全部者能夠經過https://hstspreload.org/提交其域名。

參考連接

相關文章
相關標籤/搜索