淺談 HTTP Strict Transport Security (HSTS)

在資安越來越重要的現在,如何提升網站安全性是很重要的議題,今天將簡單介紹 HTTP Strict Transport Security(簡稱 HSTS),讓你有個初步的了解並知道如何使用它

HSTS 是一個透過在 HTTP Response Header 中設定的安全機制,它可以強制使用者在未來訪問網站時一定要使用 HTTPS 協定,並且當網站憑證出問題時,使用者不可以忽略警告而繼續訪問網站

因此,如果網站憑證出問題,那段時間內使用者會完全無法訪問網站,在使用此安全機制時,務必要考量此點,並做好對應措施

要啟用此機制相當簡單,在回應的 Header 中加入 Strict-Transport-Security 即可,格式如下

Strict-Transport-Security: max-age=<expire-time>[; includeSubDomains ][; preload]

  • max-age:此機制在未來多久時間內瀏覽器必須遵守,單位是秒
  • includeSubDomains:是否要將子域名也加入此機制中,是可選 directive
  • preload:下文將會說明,是可選 directive

註:HSTS Header 僅在 HTTPS 協定中才有效,因此在 HTTP 協定中設置 HSTS Header 將不會有效果

舉個例子,當訪問的網站是 example.com,HSTS 格式是

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

這樣代表瀏覽器在接下來的 86400 秒內(一天),訪問 example.com 以及其子域名(如:b.example.com、a.b.example.com)時,都必須走 HTTPS 協定且該網站憑證必須是有效的;而如果沒有 includeSubDomains,則就只限定 example.com 此域名

只要簡單的設定,就可以確保未來使用者訪問網站時一定是走 HTTPS 協定,效益十分高,但你有可能會問,使用 301 或 302 的重新導向一樣可以讓使用者走 HTTPS 協定,那還有必要設定此 Header 嗎

答案是肯定的,因為 HSTS 的重新導向是在瀏覽器就完成(如下圖),一般的重新導向是在建立 HTTP 連線後再導向 HTTPS,因此,在 HTTP 的階段時可能就被攻擊了

HSTS 的重新導向是 307 Internal Redirect

那麼,你又有可能會問,HSTS Header 必須在 HTTPS 協定下才會生效,那如果使用者第一次訪問時是走 HTTP 協定,不就 GG 了嗎

這問題很棒,真的很棒,有點難解,但還記得剛剛的 preload 嗎,這時就是它的主場了

preload 目的是讓使用者即使在第一次訪問網站時,也可以強制使用者走 HTTPS 協定,那你可能會問,使用者都還沒來過我的網站,是要怎麼知道啦,因此,並不是單單加上 preload 這個 directive 而已,接下來將說明為了解決這個難題,需要有哪些操作

不過在這之前,你可以想想看要怎麼解決這個問題,讓你思考三秒鐘

3…

2…

1…

沒錯,就是直接寫在瀏覽器的原始碼中,表明我這個網站就是要走 HTTPS,要完成這個步驟可能會需要數週時間,而且反悔非常麻煩,因此請謹慎思考後再決定是否要這樣做

為了確保使用者在第一次訪問你的網站就是走 HTTPS 協定,你必須將你的網站加進 HSTS Preload List 中,而在申請加入 HSTS Preload List 前,請先檢查是否符合以下條件

  1. 網站必須有有效憑證
  2. 所有子域名也都必須支援 HTTPS 協定
  3. 如果你的網站有提供 HTTP 協定,那麼所有 HTTP 的連線都必須被導向 HTTPS,例如當使用者訪問 http://example.com 時,必須透過 301 或 302 導向 https://example.com
  4. HSTS Header 必須滿足以下條件
    1. max-age 必須大於 10886400 秒(十八週)
    2. 必須有 includeSubDomains directive
    3. 必須有 preload directive
    4. 如果有多次的重新導向,中間的導向也必須含有 HSTS Header

當所有條件都符合後,就可以到 https://hstspreload.org 此網站申請加入 HSTS Preload List 中囉,因為是要將域名寫進原始碼中,因此是每個 Chrome 版本更新一次清單,等待時間可能會到數個月,詳細的更新紀錄可以到此查看

介紹大概就到這裡,如果有任何問題的話,可以在留言詢問呦 🙂