HSTS 詳解,讓 HTTPS 更安全

又拍雲發表於2019-04-25

隨著網際網路的快速發展,人們在生活中越來越離不開網際網路。無論是社交、購物還是搜尋,網際網路都能給人帶來很多的便捷。與此同時,由於使用者對網路安全的不瞭解和一些網站、協議的安全漏洞,讓很多使用者的個人資訊資料“裸露”在網際網路中。為此谷歌在 Chrome 68 版本後,其介面將會讓使用者更容易瞭解 HTTP 網頁是不安全的,並持續推動網站預設使用 HTTPS。但 HTTP 依舊可以訪問使用,為此一些網站可以設定 HSTS 策略,以此來強制瀏覽器使用 HTTPS 與網站通訊,來保障網站更加安全。

HSTS 詳解,讓 HTTPS 更安全

多了 SSL 層的 HTTP 協議

在聊 HSTS 之前,先來簡單說下 HTTPS。簡而言之,HTTPS 就是在 HTTP 下加入了 SSL 層,從而保護了交換資料隱私和完整性,提供對網站伺服器身份認證的功能,簡單來說它就是安全版的 HTTP。一般來說,HTTPS 主要用途有三個:一是通過證書等資訊確認網站的真實性;二是建立加密的資訊通道;三是資料內容的完整性。

HSTS 詳解,讓 HTTPS 更安全

圖中是HTTPS的握手流程,相比 HTTP,HTTPS 傳輸更加安全。

  • 所有資訊都是加密傳播,黑客無法竊聽。
  • 具有校驗機制,一旦被篡改,通訊雙方會立刻發現。
  • 配備身份證書,防止身份被冒充。

強制 HTTPS,保障資料安全

HSTS(HTTP Strcit-Transport-Securit)即 HTTP 嚴格傳輸安全, 是一種 Web 安全策略機制,可保護網站免受協議降級攻擊和 cookie 劫持、中間人攻擊。它允許 Web 伺服器宣告瀏覽器(或其他符合要求的使用者代理)應用使用安全的 HTTPS 連線與互動,而不是通過不安全的 HTTP 協議。

HSTS 詳解,讓 HTTPS 更安全

HSTS 詳解,讓 HTTPS 更安全

使用 HSTS 策略後,在快取時間內,對應的域名請求都將會自動轉換為安全的 HTTPS 方法。若瀏覽器使用 HTTP 訪問時,瀏覽器內部會通過 307 跳轉為 HTTPS 訪問,並新增響頭 Non-Authorizatative-Reason:HSTS。並在 200 響應頭欄位返回 strict-transport-security: max-age=127800(2 天-自定義)。

HSTS 詳解,讓 HTTPS 更安全

與此同時,若使用者訪問到不安全的 HTTPS 網站時,瀏覽器會提示使用者當前訪問的網站不安全且禁止使用者訪問。如果僅使用 HTTPS 協議,雖然它也會提醒訪問的網站的安全性存在問題,但依然可以通過忽略危險進行訪問。使用 HSTS 策略後,瀏覽器會終止任何和所有安全傳輸錯誤或警告的任何安全傳輸連線嘗試。也就不能忽略瀏覽器的不安全提示,無法進行不安全的訪問連線,從而進一步保證使用者的資料安全。

image

啟用 HSTS 後,使用 HTTPS 訪問後會在響應頭新增 HSTS 響應欄位:

Strict-Transport-Security: max-age=ExpireTime [;includeSubDomains][; preload]

其中 max-age 是必選引數,可以是 ‘0’ 以上的任何值,一般設定快取 180 天。這個變數定義HSTS 響應頭在瀏覽器中的快取時間。

Strict-Transport-Security: max-age=15552000

[includeSubDomains] 是可選引數,表示瀏覽器將此策略應用於當前域名的所有子域。

Strict-Transport-Security: max-age=15552000; includeSubDomains

[repload] 也是可選引數,表示使用 preload 預載入功能,此域名同意申請加入瀏覽器發發起的 Preload List。

Strict-Transport-Security: max-age=15552000; includeSubDomains; preload

HSTS 預載入,讓安全無漏洞

需要注意的是,HSTS 協議必須是已經使用 HTTPS 訪問並且快取到瀏覽器時才會生效策略,如果使用者使用的是 HTTP 協議或直接輸入域名(瀏覽器預設使用 HTTP)的方式進行訪問。如www.example.com , www.example.com 。雖然可以通過 301 等跳轉將 HTTP 跳轉到 HTTPS,但跳轉使用的 HTTP 明文傳輸,這就給中間人攻擊提供了可能。它可以在使用 HTTP 傳輸時對跳轉資訊的資訊進行劫持,從而將跳轉頁面指向攻擊者指定的頁面。而且 301 跳轉不會出現警示資訊,客戶端很容易在不知情的情況下被攻擊劫持。

image

這時我們就可以使用 HSTS 的預載入功能,預載入可以將指定域名新增到 Preload List 名單中,新增到 Preload List 名單後,瀏覽器就只能通過 HTTPS 方法來進行訪問,從而杜絕 HTTP 訪問時被這類攻擊的可能。您可以通過訪問hstspreload.org/ 提交域名申請。但需要注意的是,新增後的域名將會硬編碼到瀏覽器內,除非能保證域名會長久使用 HTTPS,否則請勿隨意加入 Preload List。

HSTS 讓網站安全等級更高一層

開啟 HSTS 後,在 ssllabs 上進行測試,網站的安全等級會從 A 升級至 A+。

HSTS 詳解,讓 HTTPS 更安全

開啟前等級為:A

HSTS 詳解,讓 HTTPS 更安全

開啟後等級變為:A+

又拍雲也提供HTTPS安全等級檢測,有興趣的小夥伴可前往:www.upyun.com/https 嘗試下。

Chrome、Safari、Firefox 等瀏覽器都已經開始相繼支援 HSTS,下圖為各大瀏覽器對 HSTS 的支援情況(對於不支援的瀏覽器,又拍雲會忽略此響應頭,對使用者的訪問無影響):

HSTS 詳解,讓 HTTPS 更安全

對於那些安全性要求較高的網站,啟用 HSTS 無疑是不錯的選擇。當使用者訪問網站域名時,都能夠讓使用者使用 HTTPS 來請求網站資源,可以更加有效地保護網站和使用者的資料安全,並且減少使用者等待 301/302 的跳轉時間,帶來更好的使用者體驗。

推薦閱讀:

當 “HTTP” 先生遇上“S”小姐

瞭解 HTTPS,讀這篇文章就夠了​

相關文章