
Google 不斷推廣 HTTPS 加密協議已經有很長一段時間,早期大部分網站認為只有在需要傳輸使用者重要資訊(例如密碼、信用卡卡號)才需要啟用加密功能,但現況看來實在找不到不將網站轉為 HTTPS 的理由,支援更快的 HTTP/2 、免費 Let’s Encrypt 憑證,對於搜尋引擎來說也會有額外的 SEO 加分效果。當然也不是只有轉成 HTTPS 一句話那麼簡單,要進行的準備工作還不少,我寫過一篇「在 WordPress 設定 HTTPS,強制使用 SSL 安全加密協定教學」有詳細介紹過這個議題。
在 SSL 中有一個很重要的機制叫做「HSTS」(HTTP Strict Transport Security),中文翻譯為「HTTP 強制安全傳輸」,顧名思義就是告訴瀏覽器這個網站強制使用 HTTPS 協定,藉此減少連線過程可能遭遇的風險。開啟 HSTS 後未來瀏覽器就會自動將 HTTP 轉為 HTTPS 請求,即使憑證失效,使用者也無法忽略警告繼續瀏覽網站。
如果熟悉 HSTS 運作方式,會知道在 HTTP header 加入 Strict-Transport-Security
參數就能告訴瀏覽器該網站使用強制安全傳輸機制,在遇到使用 HTTP 訪問時就能自動跳轉到 HTTPS,但很多人可能不知道,常見瀏覽器都使用一份叫做「HSTS Preload List」的網站列表。
HSTS Preload List 是一份包含在 Chrome 瀏覽器的網域名稱清單,這份清單會把支援 HSTS 網域名稱直接寫進瀏覽器,在訪問網站前就直接使用 HTTPS 作為傳輸協議,也能讓速度稍微加快一些。目前主要瀏覽器包括 Chrome、Firefox、Opera、Safari、IE 和 Edge 都有一份基於 HSTS Preload List 的預先載入清單。
如果你決定讓網站永久使用 HTTPS 協議,可主動提交網域名稱至 HSTS Preload List,過程不算太難,但需要滿足一些條件,包括:
- 使用有效的 SSL 憑證。
- 在同網址上將 HTTP 重新導向至 HTTPS。
- 讓所有子網域名稱都使用 HTTPS 協定。
- 在 HTTPS 請求時傳送一個 HSTS header。
更多細節我在接下來示範提交過程時會一併說明,如果不夠清楚,建議使用者上網尋找其他相關資料,因為 HTTPS 牽涉的技術較多,可能必須要更動到程式碼,若沒有設定完整就貿然開啟 HSTS 可能會讓網站無法正常開啟運作,請務必小心。
網站名稱:HSTS Preload List
網站鏈結:https://hstspreload.org/
使用教學
STEP 1
首先,請先完成所有和 HTTPS 有關的設定再到 HSTS Preload List 網站,否則對你來說是沒有意義的,這些設定包括安裝有效的 SSL 憑證,讓網站可以順利使用 HTTPS 加密安全協議開啟,沒有混合內容等問題。
開啟 HSTS Preload List 輸入要加入列表的網域名稱,點選按鈕檢查預先載入狀態。

通常第一次會遇到一些問題,例如網站沒有傳送 HSTS header,或者 HTTP 沒有正確設定重新跳轉(Redirect)到 HTTPS 等等,這些都很好解決,不知道怎麼做就上網 Google 一下解決方法,HSTS Preload List 首頁也有一些資訊說明。
如果你是使用 Cloudflare,這些問題就更好解決了,回到「Crypto」選項把「Always Use HTTPS」和「HTTP Strict Transport Security (HSTS)」開啟即可。
STEP 2
逐步修正後,反覆使用 HSTS Preload List 網站進行檢查,出現綠色背景代表相關設定一切就緒,符合提交到列表的狀態。網站會告訴使用者目前該網域名稱尚未加入預先載入的列表,可以透過下方表單提交申請。

勾選確認你是該網站的擁有者,或者有足夠權限設定預先載入 HSTS,更重要的是使用者必須了解未來在該網域名稱下的所有子網域名稱都會遵循 HSTS,若沒有提供有效的 SSL 憑證就無法順利存取網站,勾選後點選最下方的按鈕就能將網站提交到 HSTS Preload List。

STEP 3
出現成功畫面,網站已經提交到 HSTS 預先載入列表中,在等待過程必須繼續維持使用 HTTPS,否則可能會被移除列表,這段等待期間大約需要數週,你可以反覆回來這個網站查看你的網域名稱狀態。

STEP 4
一旦網域名稱申請被接受,加入 HSTS Preload List 後再到網站查詢就會顯示已經是預先載入狀態,如此一來你的網站也會成為完整的 HSTS(直接寫入瀏覽器的預先載入網域名稱列表),不過必須得等到瀏覽器更新才會開始採用新的列表,這可能又需要幾個月,整個流程會相當費時。

要注意的是一旦加入 HSTS Preload List,未來要再請求移除就會非常麻煩,在完成移除到瀏覽器更新可能需要好幾個月時間,無法提供任何保證,不要輕易加入 Preload List 除非你已經清楚知道自己在做什麼,還有你的網站會永久使用 HTTPS 協議,否則可能會對你的網站造成一些很難以復原的結果。
值得一試的三個理由:
- 讓網站啟用 HSTS,強制使用 HTTPS 加密連線
- 加入預先載入網域名稱列表,讓連線更安全可靠
- 常見瀏覽器都有一份基於 HSTS Preload List 的域名清單