最近對(duì)我的個(gè)人網(wǎng)站啟用了Https慷暂,所以想設(shè)置http默認(rèn)自動(dòng)轉(zhuǎn)https訪問的功能驹闰,但又不想總讓服務(wù)端做轉(zhuǎn)發(fā)操作定硝,那樣浪費(fèi)資源皿桑。那么有什么好的辦法呢?
302跳轉(zhuǎn)
通常將 HTTP 請(qǐng)求 302 跳轉(zhuǎn)到 HTTPS蔬啡,但有問題:
1.不安全诲侮,302 跳轉(zhuǎn)會(huì)暴露用戶訪問站點(diǎn),易被劫持箱蟆。
2.多增加一次訪問沟绪,使得客戶端響應(yīng)速度慢。302 跳轉(zhuǎn)需要一個(gè) RTT(The role of packet loss and round-trip time)空猜,瀏覽器執(zhí)行跳轉(zhuǎn)也需要時(shí)間绽慈。
HSTS
302 跳轉(zhuǎn)是由瀏覽器觸發(fā)的恨旱,服務(wù)器無法完全控制,這個(gè)需求導(dǎo)致了 HSTS(HTTP Strict Transport Security)的誕生坝疼。HTSP 就是添加 header 頭(add_header Strict-Transport-Security max-age=15768000;includeSubDomains)搜贤,告訴瀏覽器網(wǎng)站使用 HTTPS 訪問,支持HSTS的瀏覽器就會(huì)在后面的請(qǐng)求中直接切換到 HTTPS裙士。在 Chrome 中會(huì)看到瀏覽器自己會(huì)有個(gè) 307 Internal Redirect 的內(nèi)部重定向入客。在一段時(shí)間內(nèi)也就是max-age定義的時(shí)間,不管用戶輸入 www.liberalman.cn 還是 http://www.liberalman.cn 腿椎,都會(huì)默認(rèn)將請(qǐng)求內(nèi)部跳轉(zhuǎn)到https://www.liberalman.cn 桌硫。
采用HSTS協(xié)議的網(wǎng)站將保證瀏覽器始終連接到該網(wǎng)站的HTTPS加密版本,不需要用戶手動(dòng)在URL地址欄中輸入加密地址啃炸。
該協(xié)議將幫助網(wǎng)站采用全局加密铆隘,用戶看到的就是該網(wǎng)站的安全版本。
HSTS的作用是強(qiáng)制客戶端(如瀏覽器)使用HTTPS與服務(wù)器創(chuàng)建連接南用。服務(wù)器開啟HSTS的方法是膀钠,當(dāng)客戶端通過HTTPS發(fā)出請(qǐng)求時(shí),在服務(wù)器返回的超文本傳輸協(xié)議響應(yīng)頭中包含Strict-Transport-Security字段裹虫。非加密傳輸時(shí)設(shè)置的HSTS字段無效肿嘲。
比如,https://www.liberalman.cn 的響應(yīng)頭含有Strict-Transport-Security: max-age=31536000; includeSubDomains筑公。這意味著兩點(diǎn):
在接下來的一年(即31536000秒)中雳窟,瀏覽器只要向xxx或其子域名發(fā)送HTTP請(qǐng)求時(shí),必須采用HTTPS來發(fā)起連接匣屡。比如封救,用戶點(diǎn)擊超鏈接或在地址欄輸入 http://www.liberalman.cn/ ,瀏覽器應(yīng)當(dāng)自動(dòng)將 http 轉(zhuǎn)寫成 https捣作,然后直接向 https://www.liberalman.cn/ 發(fā)送請(qǐng)求誉结。
在接下來的一年中,如果 www.liberalman.cn 服務(wù)器發(fā)送的TLS證書無效券躁,用戶不能忽略瀏覽器警告繼續(xù)訪問網(wǎng)站惩坑。
服務(wù)器端配置HSTS,減少302跳轉(zhuǎn)也拜,其實(shí)HSTS的最大作用是防止302 HTTP劫持旭贬。HSTS的缺點(diǎn)是瀏覽器支持率不高,另外配置HSTS后HTTPS很難實(shí)時(shí)降級(jí)成HTTP搪泳。同時(shí)稀轨,也建議啟用SPDY來提高性能,不累述岸军。
nginx如何配置HSTS
在nginx的配置中奋刽,在https的server站點(diǎn)添加如下頭部:
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
這樣當(dāng)?shù)谝淮我詇ttps方式訪問我的網(wǎng)站瓦侮,nginx則會(huì)告知客戶端的瀏覽器,以后即便地址欄輸入http佣谐,也要瀏覽器改成https來訪問我的nginx服務(wù)器肚吏。是不是很爽,服務(wù)器再也不管http轉(zhuǎn)發(fā)到https這檔子事了狭魂,由瀏覽器自己把http改名字為https再來請(qǐng)求服務(wù)器罚攀,這不就減少了訪問服務(wù)器的次數(shù)了嗎,節(jié)省了不少資源雌澄。
實(shí)測(cè)效果斋泄,重啟nginx后,第一次訪問用了http镐牺,發(fā)現(xiàn)沒有跳轉(zhuǎn)炫掐。當(dāng)然不跳了,人家HSTS生效是要你訪問https才生效的睬涧。然后輸入了https的網(wǎng)址募胃,下來再重新輸入http,神奇了畦浓,真的瀏覽器自己替換成了https痹束,再試試依然會(huì)替換,看我的配置讶请,大概會(huì)維持63072000s吧祷嘶,哈哈。
如果用戶第一次訪問是http秽梅,以后還是http,就是不用一次https剿牺,那我們豈不是一直不能是的HSTS生效了企垦?所以這里再加個(gè)配置,在http站點(diǎn)的server下晒来,添加配置
return 301 https://$host;
這樣當(dāng)客戶端訪問http的時(shí)候钞诡,nginx就給他轉(zhuǎn)到https上去,那訪問了一次https后湃崩,以后瀏覽器自己就往https上轉(zhuǎn)了荧降,發(fā)到nginx的也就是https的請(qǐng)求了!
另外如果為了避免點(diǎn)擊劫持攒读,還要添加 X-Frame-Options 頭部朵诫,確保不會(huì)嵌入到frame 或 iframe,使得網(wǎng)站的內(nèi)容不會(huì)嵌入到其他網(wǎng)站薄扁。
add_header X-Frame-Options "DENY";
瀏覽器支持
Chromium和Google Chrome從4.0.211.0版本開始支持HSTS
Firefox 4及以上版本
Opera 12及以上版本
Safari從OS X Mavericks起
Internet Explorer從Windows 10技術(shù)預(yù)覽版開始支持剪返,之后微軟又向IE11用戶推送了支持HSTS的更新废累。
缺點(diǎn)
HSTS并不是HTTP會(huì)話劫持的完美解決方案。用戶首次訪問某網(wǎng)站是不受HSTS保護(hù)的脱盲。這是因?yàn)槭状卧L問時(shí)邑滨,瀏覽器還未收到HSTS,所以仍有可能通過明文HTTP來訪問钱反。如果他們通過HTTP訪問HSTS保護(hù)的網(wǎng)站時(shí):
- 以前從未訪問過該網(wǎng)站
- 最近重新安裝了其操作系統(tǒng)
- 最近重新安裝了其瀏覽器
- 切換到新的瀏覽器
- 切換到一個(gè)新的設(shè)備如移動(dòng)電話
- 刪除瀏覽器的緩存
- 最近沒訪問過該站并且max-age過期了
解決這個(gè)不足目前有兩種方案
一是瀏覽器預(yù)置HSTS域名列表掖看,Google Chrome、Firefox面哥、Internet Explorer和Spartan實(shí)現(xiàn)了這一方案哎壳。google堅(jiān)持維護(hù)了一個(gè)“HSTS preload list”的站點(diǎn)域名和子域名,并通過https://hstspreload.appspot.com/提交其域名幢竹。該域名列表被分發(fā)和硬編碼到主流的web瀏覽器耳峦。客戶端訪問此列表中的域名將主動(dòng)的使用HTTPS焕毫,并拒絕使用HTTP訪問該站點(diǎn)蹲坷。
一旦設(shè)置了STS頭部或者提交了你的域名到HSTS預(yù)加載列表,這是不可能將其刪除的邑飒。這是一個(gè)單向的決定使你的域名通過HTTPS可用的循签。
二是將HSTS信息加入到域名系統(tǒng)記錄中。但這需要保證DNS的安全性疙咸,也就是需要部署域名系統(tǒng)安全擴(kuò)展县匠。截至2014年這一方案沒有大規(guī)模部署。
由于HSTS會(huì)在一定時(shí)間后失效(有效期由max-age指定)撒轮,所以瀏覽器是否強(qiáng)制HSTS策略取決于當(dāng)前系統(tǒng)時(shí)間乞旦。部分操作系統(tǒng)經(jīng)常通過網(wǎng)絡(luò)時(shí)間協(xié)議更新系統(tǒng)時(shí)間,如Ubuntu每次連接網(wǎng)絡(luò)時(shí)题山,OS X Lion每隔9分鐘會(huì)自動(dòng)連接時(shí)間服務(wù)器兰粉。攻擊者可以通過偽造NTP信息,設(shè)置錯(cuò)誤時(shí)間來繞過HSTS顶瞳。解決方法是認(rèn)證NTP信息玖姑,或者禁止NTP大幅度增減時(shí)間。比如Windows 8每7天更新一次時(shí)間慨菱,并且要求每次NTP設(shè)置的時(shí)間與當(dāng)前時(shí)間不得超過15小時(shí)焰络。
創(chuàng)建于 2017-05-18 成都,更新于 2017-05-18 成都
該文章在以下平臺(tái)同步
- LIBERALMAN: https://www.liberalman.cn/article/91
- CSDN: http://blog.csdn.net/socho/article/details/72456008
- 簡(jiǎn)書:
- [1] 引用