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


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

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

 

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

HSTS簡介

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

HSTS響應頭格式

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

  • includeSubDomains,可選參數,如果指定這個參數,表明這個網站所有子域名也必須通過HTTPS協議來訪問。

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

HSTS Preload List

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

目前這個Preload List由Google Chrome維護,Chrome、Firefox、Safari、IE 11和Microsoft Edge都在使用。如果要想把自己的域名加進這個列表,首先需要滿足以下條件:

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

  • 將所有HTTP流量重定向到HTTPS;

  • 確保所有子域名都啟用了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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM