關于(At)HSTS安全協議的(Of)全面詳細解析
HTTP 嚴格傳輸安全(HSTS)是(Yes)一(One)種安全功能,web 服務器通過它來告訴浏覽器僅用(Use) HTTPS 來與之通訊,而不(No)是(Yes)使用(Use) HTTP。HSTS 是(Yes)網站從 HTTP 到 HTTPS 中網站性能及安全優化非常重要(Want)的(Of)一(One)個(Indivual)步驟,能夠解決和(And)兼容 HTTPS 中的(Of)一(One)些不(No)足之處。HSTS 在(Exist)全站 HTTPS 下有一(One)個(Indivual)較大(Big)的(Of)正向作(Do)用(Use),推薦使用(Use)。
一(One)、HSTS 是(Yes)什麽?
國(Country)際互聯網工程組織 IETE 正在(Exist)推行一(One)種新的(Of) Web安全協議HTTP Strict Transport Security(HSTS)。采用(Use) HSTS 協議的(Of)網站将保證浏覽器始終連接到該網站的(Of) HTTPS 加密版本,不(No)需要(Want)用(Use)戶手動在(Exist) URL 地址欄中輸入加密地址。該協議将幫助網站采用(Use)全局加密,用(Use)戶看到的(Of)就是(Yes)該網站的(Of)安全版本。
HSTS 的(Of)作(Do)用(Use)是(Yes)強制客戶端(如浏覽器)使用(Use) HTTPS 與服務器創建連接。服務器開啓 HSTS 的(Of)方法是(Yes),當客戶端通過 HTTPS 發出(Out)請求時(Hour),在(Exist)服務器返回的(Of)超文本傳輸協議響應頭中包含 Strict-Transport-Security 字段。非加密傳輸時(Hour)設置的(Of) HSTS 字段無效。
HTTPS 最典型的(Of)用(Use)戶訪問過程
通常我們訪問一(One)個(Indivual)網站時(Hour),一(One)般在(Exist)浏覽器中隻輸入網站地址,而不(No)輸入協議名。比如訪問合肥網站建設公司夢揚科技網站,如果直接輸入網址 https://e926.com 或 e926.com 時(Hour),這(This)就給了(Got it)中間人(People)攻擊的(Of)一(One)個(Indivual)機會,重定向會可能會被破壞,從而定向到一(One)個(Indivual)惡意站點而不(No)是(Yes)應該訪問的(Of)加密頁面。HTTP 嚴格傳輸安全(HSTS)功能使 Web 服務器告知浏覽器絕不(No)使用(Use) HTTP 訪問,在(Exist)浏覽器端自動将所有到該站點的(Of) HTTP 訪問替換爲(For) HTTPS 訪問。
即使你打開網站看到的(Of)是(Yes)全站 HTTPS 狀态 ,你是(Yes)因爲(For)我們在(Exist)服務器上(Superior)做過301/302 跳轉到 https://www.e926.com這(This)個(Indivual)地址的(Of), HTTPS 網站的(Of)做法是(Yes)對用(Use)戶的(Of) HTTP 訪問做 302 跳轉到 HTTPS,并重新建連。
那麽問題也就來了(Got it),在(Exist)這(This)個(Indivual)跳轉的(Of)過程中就有兩個(Indivual)不(No)足之處:
- 整個(Indivual)通信過程中的(Of)前兩個(Indivual) RT 是(Yes)沒有意義的(Of);
- 使用(Use)了(Got it)不(No)安全的(Of) HTTP 通信,萬一(One)你是(Yes)在(Exist)提交敏感數據呢。
HSTS 的(Of)出(Out)現就是(Yes)解決這(This)些問題的(Of)。HSTS 的(Of)作(Do)用(Use)除了(Got it)節省 HTTPS 通信 RT 和(And)強制使用(Use) HTTPS ,還包括:
- 阻止基于(At)SSLStrip 的(Of)中間人(People)攻擊;
- 萬一(One)證書有錯誤,則顯示錯誤,用(Use)戶不(No)能回避警告。
HSTS 的(Of)工作(Do)機制可描述如下:服務器端配置支持 HSTS 後,會在(Exist)給浏覽器返回的(Of) HTTP 首部中攜帶 HSTS 字段。浏覽器獲取到該信息後,會将所有 HTTP 訪問請求在(Exist)内部做307跳轉到 HTTPS,而無需任何網絡過程,從而提高了(Got it)兼容性,這(This)個(Indivual)機制對于(At)不(No)支持 HTTPS 的(Of)搜索引擎來說也是(Yes)非常友好的(Of)做法。
目前大(Big)部分浏覽器對 HSTS 的(Of)支持已經相當完美,具體各浏覽器和(And)版本的(Of)支持情況可以(By)在(Exist)http://caniuse.com/#search=HSTS上(Superior)查看。 但是(Yes) HSTS 是(Yes)有缺陷的(Of),第一(One)次訪問網站的(Of)客戶端,HSTS 并不(No)工作(Do)。 要(Want)解決這(This)個(Indivual)問題,就要(Want)了(Got it)解我們下面要(Want)講解的(Of) HSTS preload list。
HSTS preload list 是(Yes)什麽?
HSTS preload list 是(Yes) Chrome 浏覽器中的(Of) HSTS 預載入列表,在(Exist)該列表中的(Of)網站,使用(Use) Chrome 浏覽器訪問時(Hour),會自動轉換成 HTTPS。Firefox、Safari、Edge 浏覽器也會采用(Use)這(This)個(Indivual)列表。
加入 HSTS preload list 所需條件:
- 有效的(Of)證書;
- 将所有 HTTP 流量重定向到 HTTPS;
- 确保所有子域名啓用(Use) HTTPS,特别是(Yes) www 子域名。
同時(Hour)輸出(Out)的(Of) HSTS 響應頭部需要(Want)滿足以(By)下條件:
- max-age 至少需要(Want) 18 周,10886400 秒
- 必須指定 includeSubdomains 參數
- 必須支持 preload 參數
一(One)個(Indivual)典型滿足 HSTS preload list 的(Of)響應頭部爲(For):Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
從申請到審核通過,時(Hour)間在(Exist)幾天到幾周不(No)等。值得一(One)提的(Of)是(Yes),從審核通過到正式加入到 Chrome 的(Of) stable release 版本中還需要(Want)一(One)段時(Hour)間,因爲(For)要(Want)經過 canary、dev、beta 以(By)及 stable progression。
HSTS 的(Of)優勢及必要(Want)性
簡單說就是(Yes)強制客戶端使用(Use) HTTPS 訪問頁面。有效避免了(Got it)中間人(People)對 80 端口的(Of)劫持。但是(Yes)這(This)裏存在(Exist)一(One)個(Indivual)問題:如果用(Use)戶在(Exist)劫持狀态,并且沒有訪問過源服務器,那麽源服務器是(Yes)沒有辦法給客戶端種下 Strict-Transport-Security 響應頭的(Of)(都被中間人(People)擋下來了(Got it))。
啓用(Use) HSTS 不(No)僅僅可以(By)有效防範中間人(People)攻擊,同時(Hour)也爲(For)浏覽器節省來一(One)次 302/301 的(Of)跳轉請求,收益還是(Yes)很高的(Of)。我們的(Of)很多頁面,難以(By)避免地出(Out)現 http 的(Of)鏈接,比如 help 中的(Of)鏈接、運營填寫的(Of)鏈接等,這(This)些鏈接的(Of)請求都會經曆一(One)次 302,對于(At)用(Use)戶也是(Yes)一(One)樣,收藏夾中的(Of)鏈接保存的(Of)可能也是(Yes) http 的(Of)。
307 狀态碼
在(Exist) GET、HEAD 這(This)些幂等的(Of)請求方式上(Superior),302、303、307 沒啥區别,而對于(At) POST 就不(No)同了(Got it),大(Big)部分浏覽器 都會 302 會将 POST 請求轉爲(For) GET,而 303 是(Yes)規範強制規定将 POST 轉爲(For) GET 請求,請求地址爲(For) header 頭中的(Of) Location,307 則不(No)一(One)樣,規範要(Want)求浏覽器繼續向 Location 的(Of)地址 POST 内容。
而在(Exist) HSTS 中,307 可以(By)被緩存,緩存時(Hour)間根據 max-age 而定,一(One)般建議緩存 1 年甚至更長。
HSTS 存在(Exist)的(Of)坑
- 純 IP 的(Of)請求,HSTS 沒法處理,比如 http://2.2.2.2 , 即便響應頭中設置了(Got it) STS,浏覽器也不(No)會理會(未測試)
- HSTS 隻能在(Exist) 80 和(And) 443 端口之間切換,如果服務是(Yes) 8080 端口,即便設置了(Got it) STS,也無效(未測試)
- 如果浏覽器證書錯誤,一(One)般情況會提醒存在(Exist)安全風險,然是(Yes)依然給一(One)個(Indivual)鏈接進入目标頁,而 HSTS 則沒有目标頁入口,所以(By)一(One)旦證書配置錯誤,就是(Yes)很大(Big)的(Of)故障了(Got it)
- 如果服務器的(Of) HTTPS 沒有配置好就開啓了(Got it) STS 的(Of)響應頭,并且還設置了(Got it)很長的(Of)過期時(Hour)間,那麽在(Exist)你服務器 HTTPS 配置好之前,用(Use)戶都是(Yes)沒辦法連接到你的(Of)服務器的(Of),除非 max-age 過期了(Got it)。
- HSTS 能讓你的(Of)網站在(Exist) ssllab 上(Superior)到 A+
寫在(Exist)最後:HSTS 在(Exist)全站 HTTPS 下有一(One)個(Indivual)較大(Big)的(Of)正向作(Do)用(Use),推薦使用(Use)。
- 上(Superior)一(One)篇:建一(One)個(Indivual)企業官方網站建設需要(Want)多少錢?
- 下一(One)篇:中小企業做網站的(Of)好處有那些?