利用HSTS安全協(xié)議柔性解決全站HTTPS的兼容性問題

前言:這篇文章還是轉(zhuǎn)載的,因為我自己的站點想啟用強制HTTPS,找了半天似乎最有效的是利用HSTS協(xié)議強制跳轉(zhuǎn),這篇文章講的是如何在主流服務(wù)器上配置HSTS協(xié)議,那就轉(zhuǎn)載一下備用吧……
——————————————————————————————
一、HSTS 協(xié)議
這里我們要借助一個新的安全協(xié)議:HSTS
HSTS(HTTP Strict Transport Security)國際互聯(lián)網(wǎng)工程組織 IETE 正在推行一種新的 Web 安全協(xié)議,作用是強制客戶端(如瀏覽器)使用 HTTPS 與服務(wù)器創(chuàng)建連接。
主要目的是為了解決 HTTPS 網(wǎng)站首次請求時使用的是未加密的 HTTP 協(xié)議,也就說用戶一般訪問我們的網(wǎng)站都是直接在瀏覽器輸入域名,比如 zhangge.net,然后我們的服務(wù)器檢測到是 HTTP 請求,就 301 跳轉(zhuǎn)到 HTTPS 頁面。那么前半程采用的就是未加密的 HTTP 請求,同樣存在被劫持的可能,那么 HTTPS 說好的安全性也就大打折扣了!
在我看來,HSTS 還有另外一層好處:增強網(wǎng)站的兼容性。
以往分享的全站 HTTPS 都是采用 301 強制性跳轉(zhuǎn),而且還會區(qū)分下低版本 IE、不支持 HTTPS 的搜索引擎來忽略 301 跳轉(zhuǎn),很明顯這樣做無法照顧到所有情況。那么如果是用 HSTS 呢?
采用 HSTS 后,支持這個協(xié)議的瀏覽器會自動跳轉(zhuǎn)到 HTTPS 頁面,返回碼為 307:

而不支持 HSTS 的瀏覽器訪問我們的網(wǎng)站,則不會產(chǎn)生跳轉(zhuǎn),從而提高了兼容性。這個機制對于不支持 HTTPS 的搜索引擎來說是非常友好的做法了!
二、開啟 HSTS
開啟 HSTS 很簡單,只要在我們網(wǎng)站的響應(yīng)頭里面新增 HSTS 即可,下面簡單說下
①、Nginx 服務(wù)器
只需要在站點 server 模塊內(nèi)插入如下配置并重啟:
1. server {
2. listen 443 ssl http2;
4. # 直接在server插入測試居然不生效,最后發(fā)現(xiàn)要 在location ~ *php 內(nèi)插入:
# 以下略...

②、Apache 服務(wù)器
Apache 如下配置并重啟:
2. LoadModule headers_module modules/mod_headers.so
3. #然后在站點VirtualHost里面插入HSTS響應(yīng)頭信息,比如:

③、LigHttpd
將下述配置增加到你的 Lighttpd 配置文件(一般是 /etc/lighttpd/lighttpd.conf)并重啟:

④、通用方法
如果你用的虛擬主機,或者不會折騰 WEB 軟件,那么可以采用更簡單的通用方法。原理很簡單,通過代碼來新增響應(yīng)頭即可,這里只分享一下 php 的做法,其他語言自行參考:
將如下代碼插入到網(wǎng)站根目錄的 index.php 即可:

三、相對鏈接
當然,為了兼容不支持 HTTPS 的客戶端,我們還需要將網(wǎng)站的所有超鏈接都改成相對模式:
比如,正常的頁面鏈接如下所示:
<a href="http://www.domain.com/1.html" target="_blank">描文本</a>

改成相對模式:

<a href="//www.domain.com/1.html" target="_blank">描文本</a>
好處就是,不管是 HTTP 還是 HTTPS 請求,頁面中的地址都是和請求協(xié)議保持一致,避免出現(xiàn)頁面是 HTTP,而頁面中的鏈接卻是 HTTPS 的情況,那么前面的做法也就沒了意義。
如何修改為相對模式,估計有同學又玩不轉(zhuǎn)了。萬變不離其宗,和以前純代碼啟用七牛 CDN 一樣!
直接粗暴替換前臺輸出的代碼即可:

四、提交 HSTS
上文已介紹了 HSTS,主要是為了解決 HTTP 請求 301 跳轉(zhuǎn)到 HTTPS 這個過程被劫持問題,而實際上就算加上 HSTS 響應(yīng)頭,用戶請求的前半程依然是 HTTP,并沒有什么卵用。
提出這個協(xié)議的磚家們就想出了一個解決辦法:將支持 HSTS 的網(wǎng)站全部加入一個 Preload 的清單,支持 HSTS 協(xié)議的瀏覽器請求網(wǎng)站前會查詢當前網(wǎng)站是否在清單中,如果是那么直接轉(zhuǎn)換為 HTTPS 請求!從而解決前半程為 HTTP 的問題(不專業(yè),但說人話。。。)。
那么,如果我們的網(wǎng)站啟用了 HSTS,還得將網(wǎng)站提交到這個 Preload 清單才行了
提交地址:https://hstspreload.appspot.com/ (需要扶墻訪問)
提交直到批準,我們的網(wǎng)站必須強制 301 跳轉(zhuǎn)到 HTTPS,否則無法通過,完成審核后再取消 301 即可。
當然,提交后會顯示正在提交到 preload list,快的話兩三天,慢的話一兩個月都是有可能的:

——————————————————————————————
后記到此結(jié)束,如果想查看原文,我會在評論置頂原文鏈接。另外我個人的小站
https://www.mimikko.club
(雖然沒強制要求https,但還是希望都用https訪問吧)