開啓HSTS讓瀏覽器強制跳轉HTTPS訪問

開啓HSTS讓瀏覽器強制跳轉HTTPS訪問

來源 https://www.cnblogs.com/luckcs/articles/6944535.htmlcss

 

在網站全站HTTPS後,若是用戶手動敲入網站的HTTP地址,或者從其它地方點擊了網站的HTTP連接,一般依賴於服務端301/302跳轉才能使用HTTPS服務。而第一次的HTTP請求就有可能被劫持,致使請求沒法到達服務器,從而構成HTTPS降級劫持。這個問題目前能夠經過HSTS(HTTP Strict Transport Security,RFC6797)來解決。html

HSTS簡介

HSTS(HTTP Strict Transport Security)是國際互聯網工程組織IETF發佈的一種互聯網安全策略機制。採用HSTS策略的網站將保證瀏覽器始終鏈接到該網站的HTTPS加密版本,不須要用戶手動在URL地址欄中輸入加密地址,以減小會話劫持風險。前端

HSTS響應頭格式

Strict-Transport-Security: max-age=expireTime [; includeSubDomains] [; preload]
  • max-age,單位是秒,用來告訴瀏覽器在指定時間內,這個網站必須經過HTTPS協議來訪問。也就是對於這個網站的HTTP地址,瀏覽器須要先在本地替換爲HTTPS以後再發送請求。linux

  • includeSubDomains,可選參數,若是指定這個參數,代表這個網站全部子域名也必須經過HTTPS協議來訪問。nginx

  • preload,可選參數,一個瀏覽器內置的使用HTTPS的域名列表。web

HSTS Preload List

雖然HSTS能夠很好的解決HTTPS降級攻擊,可是對於HSTS生效前的首次HTTP請求,依然沒法避免被劫持。瀏覽器廠商們爲了解決這個問題,提出了HSTS Preload List方案:內置一份能夠按期更新的列表,對於列表中的域名,即便用戶以前沒有訪問過,也會使用HTTPS協議。chrome

目前這個Preload List由Google Chrome維護,Chrome、Firefox、Safari、IE 11和Microsoft Edge都在使用。若是要想把本身的域名加進這個列表,首先須要知足如下條件:shell

  • 擁有合法的證書(若是使用SHA-1證書,過時時間必須早於2016年);apache

  • 將全部HTTP流量重定向到HTTPS;vim

  • 確保全部子域名都啓用了HTTPS;

  • 輸出HSTS響應頭:

  • max-age不能低於18周(10886400秒);

  • 必須指定includeSubdomains參數;

  • 必須指定preload參數;

即使知足了上述全部條件,也不必定能進入HSTS Preload List,更多信息能夠查看:https://hstspreload.org/

經過Chrome的chrome://net-internals/#hsts工具,能夠查詢某個網站是否在Preload List之中,還能夠手動把某個域名加到本機Preload List。

HSTS缺點

HSTS並非HTTP會話劫持的完美解決方案。用戶首次訪問某網站是不受HSTS保護的。這是由於首次訪問時,瀏覽器還未收到HSTS,因此仍有可能經過明文HTTP來訪問。

若是用戶經過HTTP訪問HSTS保護的網站時,如下幾種狀況存在降級劫持可能:

  • 之前從未訪問過該網站

  • 最近從新安裝了其操做系統

  • 最近從新安裝了其瀏覽器

  • 切換到新的瀏覽器

  • 切換到一個新的設備,如:移動電話

  • 刪除瀏覽器的緩存

  • 最近沒訪問過該站而且max-age過時了

解決這個問題目前有兩種方案:

方案一:在瀏覽器預置HSTS域名列表,就是上面提到的HSTS Preload List方案。該域名列表被分發和硬編碼到主流的Web瀏覽器。客戶端訪問此列表中的域名將主動的使用HTTPS,並拒絕使用HTTP訪問該站點。

方案二:將HSTS信息加入到域名系統記錄中。但這須要保證DNS的安全性,也就是須要部署域名系統安全擴展。

其它可能存在的問題

因爲HSTS會在必定時間後失效(有效期由max-age指定),因此瀏覽器是否強制HSTS策略取決於當前系統時間。大部分操做系統常常經過網絡時間協議更新系統時間,如Ubuntu每次鏈接網絡時,OS X Lion每隔9分鐘會自動鏈接時間服務器。攻擊者能夠經過僞造NTP信息,設置錯誤時間來繞過HSTS。

解決方法是認證NTP信息,或者禁止NTP大幅度增減時間。好比:Windows 8每7天更新一次時間,而且要求每次NTP設置的時間與當前時間不得超過15小時。

支持HSTS瀏覽器

目前主流瀏覽器都已經支持HSTS特性,具體可參考下面列表:

  • Google Chrome 4及以上版本

  • Firefox 4及以上版本

  • Opera 12及以上版本

  • Safari從OS X Mavericks起

  • Internet Explorer及以上版本

 

HSTS(HTTP Strict Transport Security) 簡單來講就是由瀏覽器進行http向https的重定向。若是不使用HSTS,當用戶在瀏覽器中輸入網址時沒有加https,瀏覽器會默認使用http訪問,因此對於https站點,一般會在服務端進行http至https的重定向。若是用了HSTS,就能夠減小服務端的此次重定向。

當咱們部署https時,發現HSTS的這個用處後,立馬就使用了它,使用方法很簡單——在響應頭中加上 strict-transport-security:max-age=31536000 。

但後來經過星巴克的WiFi訪問咱們的https站點時發現了一個問題。在瀏覽器中輸入網址後,沒有出現星巴克WiFi的登陸頁面,而是瀏覽器認爲這是不安全鏈接,不容許訪問,只能先訪問一個http站點,出現星巴克WiFi登陸頁面並完成登陸後才能訪問咱們的https站點。

背後的緣由很簡單,因爲咱們的站點啓用了HSTS,瀏覽器默認會以https方式發出請求,星巴克的WiFi攔截了請求,以http的方式返回了WiFi登陸頁面,瀏覽器收到後一看這不安全,立馬中止鏈接。若是不啓用HSTS,在服務端進行重定向,就不會有這個問題。

只要基於http進行驗證的WiFi都會有這個問題,因此在部署https時是否啓用HSTS須要考慮這個因素。若是你原先啓用HSTS,如今想取消,不能直接去掉strict-transport-security響應頭,而是要改成 strict-transport-security:max-age=0 ,否則以前使用了HSTS的瀏覽器在過時以前會一直使用HSTS。

 

HSTS部署

服務器開啓HSTS的方法是:當客戶端經過HTTPS發出請求時,在服務器返回的超文本傳輸協議響應頭中包含Strict-Transport-Security字段。非加密傳輸時設置的HSTS字段無效。

最佳的部署方案是部署在離用戶最近的位置,例如:架構有前端反向代理和後端Web服務器,在前端代理處配置HSTS是最好的,不然就須要在Web服務器層配置HSTS。若是Web服務器不明確支持HSTS,能夠經過增長響應頭的機制。若是其餘方法都失敗了,能夠在應用程序層增長HSTS。

HSTS啓用比較簡單,只需在相應頭中加上以下信息:

Strict-Transport-Security: max-age=63072000; includeSubdomains;preload;

Strict-Transport-Security是Header字段名,max-age表明HSTS在客戶端的生效時間。 includeSubdomains表示對全部子域名生效。preload是使用瀏覽器內置的域名列表。

HSTS策略只能在HTTPS響應中進行設置,網站必須使用默認的443端口;必須使用域名,不能是IP。所以須要把HTTP重定向到HTTPS,若是明文響應中容許設置HSTS頭,中間人攻擊者就能夠經過在普通站點中注入HSTS信息來執行DoS攻擊。

Apache上啓用HSTS

$ vim /etc/apache2/sites-available/hi-linux.conf  # 開啓HSTS須要啓用headers模塊 LoadModule headers_module /usr/lib/apache2/modules/mod_headers.so <VirtualHost *:80>  ServerName www.hi-linux.com  ServerAlias hi-linux.com ...  #將全部訪問者重定向到HTTPS,解決HSTS首次訪問問題。  RedirectPermanent / https://www.hi-linux.com/ </VirtualHost> <VirtualHost 0.0.0.0:443> ... # 啓用HTTP嚴格傳輸安全  Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload" ... </VirtualHost>

重啓Apache服務

$ service apche2 restart

Nginx上啓用HSTS

$ vim /etc/nginx/conf.d/hi-linux.conf server {   listen 443 ssl;   server_name www.hi-linux.com;   add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"; ... } server {   listen 80;   server_name www.hi-linux.com;   return 301 https://www.hi-linux.com$request_uri; ... }

重啓Nginx服務

$ service nginx restart

IIS啓用HSTS

要在IIS上啓用HSTS須要用到第三方模塊,具體可參考:https://hstsiis.codeplex.com/

測試設置是否成功

設置完成了後,能夠用curl命令驗證下是否設置成功。若是出來的結果中含有Strict-Transport-Security的字段,那麼說明設置成功了。

$ curl -I https://www.hi-linux.com HTTP/1.1 200 OK Server: nginx Date: Sat, 27 May 2017 03:52:19 GMT Content-Type: text/html; charset=utf-8 ... Strict-Transport-Security: max-age=63072000; includeSubDomains; preload X-Frame-Options: deny X-XSS-Protection: 1; mode=block X-Content-Type-Options: nosniff ...

對於HSTS以及HSTS Preload List,建議是隻要不能確保永遠提供HTTPS服務,就不要啓用。由於一旦HSTS生效,以前的老用戶在max-age過時前都會重定向到HTTPS,形成網站不能正確訪問。惟一的辦法是換新域名。

參考文檔

http://www.google.com
http://t.cn/RSzfyBb
https://yuan.ga/hsts-strict-https-enabled-site/
https://imququ.com/post/sth-about-switch-to-https.html
http://www.ttlsa.com/web/hsts-for-nginx-apache-lighttpd/
http://www.jianshu.com/p/66ddc3124006

 

如何關閉瀏覽器的HSTS功能

來源  http://www.tuicool.com/articles/QbYBne

在安裝配置 SSL 證書時,可使用一種能使數據傳輸更加安全的Web安全協議,即在服務器端上開啓 HSTS (HTTP Strict Transport Security)。它告訴瀏覽器只能經過HTTPS訪問,而絕對禁止HTTP方式。 

HTTP Strict Transport Security (HSTS) is an opt-in security enhancement that is specified by a web application through the use of a special response header. Once a supported browser receives this header that browser will prevent any communications from being sent over HTTP to the specified domain and will instead send all communications over HTTPS. It also prevents HTTPS click through prompts on browsers.

可是,在平常開發的過程當中,有時咱們會想測試頁面在 HTTP 鏈接中的表現狀況,這時 HSTS 的存在會讓調試不能方便的進行下去。並且因爲 HSTS 並非像 cookie 同樣存放在瀏覽器緩存裏,簡單的清空瀏覽器緩存操做並無什麼效果,頁面依然經過 HTTPS 的方式傳輸。  那麼怎樣才能關閉瀏覽器的 HSTS 呢,各類谷歌

度娘

以後,在這裏彙總一下幾大常見瀏覽器 HSTS 的關閉方法。

Safari 瀏覽器

  1. 徹底關閉 Safari
  2. 刪除 ~/Library/Cookies/HSTS.plist 這個文件
  3. 從新打開 Safari 便可
  4. 極少數狀況下,須要重啓系統

Chrome 瀏覽器

  1. 地址欄中輸入 chrome://net-internals/#hsts
  2. 在 Delete domain 中輸入項目的域名,並 Delete 刪除
  3. 能夠在 Query domain 測試是否刪除成功

Opera 瀏覽器

和 Chrome 方法同樣

Firefox 瀏覽器

  1. 關閉全部已打開的頁面
  2. 清空歷史記錄和緩存
  3. 地址欄輸入 about:permissions
  4. 搜索項目域名,並點擊 Forget About This Site

 

 

============================= End

相關文章
相關標籤/搜索