nginx啟用HSTS以支持從http到https不通過服務(wù)端而自動(dòng)跳轉(zhuǎn)

最近對(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)同步

  • [1] 引用
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末符喝,一起剝皮案震驚了整個(gè)濱河市闪彼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌协饲,老刑警劉巖备蚓,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件课蔬,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡郊尝,警方通過查閱死者的電腦和手機(jī)二跋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來流昏,“玉大人扎即,你說我怎么就攤上這事】隽梗” “怎么了谚鄙?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)刁绒。 經(jīng)常有香客問我闷营,道長(zhǎng),這世上最難降的妖魔是什么知市? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任傻盟,我火速辦了婚禮,結(jié)果婚禮上嫂丙,老公的妹妹穿的比我還像新娘娘赴。我一直安慰自己,他們只是感情好跟啤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布诽表。 她就那樣靜靜地躺著,像睡著了一般隅肥。 火紅的嫁衣襯著肌膚如雪竿奏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天腥放,我揣著相機(jī)與錄音泛啸,去河邊找鬼。 笑死捉片,一個(gè)胖子當(dāng)著我的面吹牛平痰,可吹牛的內(nèi)容都是我干的汞舱。 我是一名探鬼主播伍纫,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼昂芜!你這毒婦竟也來了莹规?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤泌神,失蹤者是張志新(化名)和其女友劉穎良漱,沒想到半個(gè)月后舞虱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡母市,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年矾兜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片患久。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡椅寺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蒋失,到底是詐尸還是另有隱情返帕,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布篙挽,位于F島的核電站荆萤,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏铣卡。R本人自食惡果不足惜链韭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望算行。 院中可真熱鬧梧油,春花似錦敦捧、人聲如沸想括。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽量淌。三九已至骗村,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間呀枢,已是汗流浹背胚股。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留裙秋,地道東北人琅拌。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像摘刑,于是被迫代替她去往敵國(guó)和親进宝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容