淺析HSTS
一、HSTS是什么?
HSTS全稱:HTTP Strict Transport Security,意譯:HTTP嚴格傳輸安全,是一個Web安全策略機制。
二、HSTS解決什么問題?
它解決的是:網站從Http轉跳到Https時,可能出現的安全問題。
一般從Http跳轉Https的流程:
Client從Http切換到Https前是明文傳輸,因此是可以被Man-In-The-Middle劫持的,如下流程:
三、HSTS如何解決?
要解決從Http切換到Https被劫持的問題,只要一開始就沒有Http請求即可,流程如下:
四、HSTS如何知道,哪些請求該轉為Https,哪些不該轉?
方案1. 最近一次請求的Https響應中(Response)中,帶上HSTS Header:
Strict-Transport-Security: <max-age=>[; includeSubDomains][; preload]
- max-age:
- 必選,單位:秒。
- 意義:HSTS header過期時間,一般設置為1年,即31536000秒。而每次Response Header都帶上HSTS Header,則可不斷刷新其過期時間。
- includeSubDomains:
- 可選。
- 意義:需要開啟HSTS的域名/子域名。
- preload:
- 可選
- 意義:當加入了瀏覽器內置Preload List時才需要設置該項。
方案2. HSTS Preload List
方案1還是有個漏洞:
- 如果第一次訪問網站A就被劫持了,哪方案1豈不白搭?
- 清Cookies或者HSTS Header過期了,下次訪問豈不又風險重重?
基於以上問題,就需要方案2(HSTS Preload List):
官方說明:
This is a list of sites that are hardcoded into Chrome as being HTTPS only.
HSTS Preload List是一個站點列表,它被hardcode寫入Chrome中,列表中的站點將會默認使用 HTTPS 進行訪問。
Most major browsers (Chrome, Firefox, Opera, Safari, IE 11 and Edge) also have HSTS preload lists based on the Chrome list. (See the HSTS compatibility matrix.)
主流瀏覽器(Firefox, Opera, Safari, IE 11 and Edge)都有和Chrome一樣的HSTS Preload List。
這樣,就直接從源頭上封死Http轉跳Https時被劫持的可能性。
五、其他相關:
- Chrome的HSTS Preload List哪里可以看到?
- 如何加入HSTS Preload List?
- 加入HSTS Preload List的副作用?
- 因為瀏覽器會強制跳轉Https,所以以后將無法使用Http再訪問網站,如果不能保證持續提供Https服務,最好還是別折騰了。