本文部分內容參考果殼網對HTTPS的介紹,這里是原文鏈接:http://www.guokr.com/post/114121/
什么是HTTPS協議?
HTTPS(Secure Hypertext Transfer Protocol)安全超文本傳輸協議 它是一個安全通信通道,它基于HTTP開發,用于在客戶計算機和服務器之間交換信息。它使用安全套接字層(SSL)進行信息交換,簡單來說它是HTTP的安全版。
SSL是Netscape公司所提出的安全保密協議,在瀏覽器(如Internet Explorer、Netscape Navigator)和Web服務器(如Netscape的Netscape Enterprise Server、ColdFusion Server等等)之間構造安全通道來進行數據傳輸,SSL運行在TCP/IP層之上、應用層之下,為應用程序提供加密數據通道,它采用了RC4、MD5 以及RSA等加密算法,使用40 位的密鑰,適用于商業信息的加密。同時,Netscape公司相應開發了HTTPS協議并內置于其瀏覽器中,HTTPS實際上就是SSL over HTTP,它使用默認端口443,而不是像HTTP那樣使用端口80來和TCP/IP進行通信。HTTPS協議使用SSL在發送方把原始數據進行加密,然 后在接受方進行解密,加密和解密需要發送方和接受方通過交換共知的密鑰來實現,因此,所傳送的數據不容易被網絡黑客截獲和解密。
SSL目前的版本是3.0,被IETF(Internet Engineering Task Force)定義在RFC 6101中,之后IETF對SSL 3.0進行了升級,于是出現了TLS(Transport Layer Security) 1.0,定義在RFC2246。實際上我們現在的HTTPS都是用的TLS協議,但是由于SSL出現的時間比較早,并且依舊被現在瀏覽器所支持,因此SSL依然是HTTPS的代名詞,但無論是TLS還是SSL都是上個世紀的事情,SSL最后一個版本是3.0,今后TLS將會繼承SSL優良血統繼續為我們進行加密服務。目前TLS的版本是1.2,定義在RFC5246中,暫時還沒有被廣泛的使用。
HTTPS的工作原理
HTTPS在傳輸數據之前需要客戶端(瀏覽器)與服務端(網站)之間進行一次握手,在握手過程中將確立雙方加密傳輸數據的密碼信息。TLS/SSL中使用了非對稱加密,對稱加密以及HASH算法。關于非對稱加密,對稱加密涉及密碼學相關知識,我們簡單了解一下。
先看的是對稱加密,所謂的對稱加密,加密解密用的是同樣的“鑰匙。用郵局的例子來解釋下對稱加密,Alice 在盒子里放有信息,盒子上有掛鎖,她有鑰匙。通過郵局她把這個盒子寄給Bob。Bob收到盒子后,用相同的鑰匙打開盒子(鑰匙之前就得到了,可能是Alice面對面給他的)。然后Bob可以用同樣的方法回復。
然后看非對稱加密,非對稱加密的加密解密用的是不同的“鑰匙”。還是用Bob和Alice舉例子:Bob和Alice各有自己的盒子。Alice要跟Bob秘密通信,她先讓Bob把開著的盒子通過郵局發給她。Alice拿到盒子后放入信息鎖上,然后發給Bob。Bob就可以用他自己的鑰匙打開了。回復的話就用同樣的方法。
HTTPS握手過程的簡單描述如下:
- 瀏覽器將自己支持的一套加密規則發送給網站。
- 網站從中選出一組加密算法與HASH算法,并將自己的身份信息以證書的形式發回給瀏覽器。證書里面包含了網站地址,加密公鑰,以及證書的頒發機構等信息。
- 獲得網站證書之后瀏覽器要做以下工作:
- 驗證證書的合法性(頒發證書的機構是否合法,證書中包含的網站地址是否與正在訪問的地址一致等),如果證書受信任,則瀏覽器欄里面會顯示一個小鎖頭,否則會給出證書不受信的提示。
- 如果證書受信任,或者是用戶接受了不受信的證書,瀏覽器會生成一串隨機數的密碼,并用證書中提供的公鑰加密。
- 使用約定好的HASH計算握手消息,并使用生成的隨機數對消息進行加密,最后將之前生成的所有信息發送給網站。
- 網站接收瀏覽器發來的數據之后要做以下的操作:
- 使用自己的私鑰將信息解密取出密碼,使用密碼解密瀏覽器發來的握手消息,并驗證HASH是否與瀏覽器發來的一致。
- 使用密碼加密一段握手消息,發送給瀏覽器。
- 瀏覽器解密并計算握手消息的HASH,如果與服務端發來的HASH一致,此時握手過程結束,之后所有的通信數據將由之前瀏覽器生成的隨機密碼并利用對稱加密算法進行加密。
SSL證書怎么來的?
SSL證書可以向CA機構通過付費的方式申請,也可以自己制作。CA機構頒發的證書價格非常昂貴,而且有效期一般只有一年到三年不等(年數不同,價格也不同),過期之后還要再次交錢申請,因此一般只有企業才會申請證書。但是隨著個人網站的增多,目前也有針對個人的SSL證書服務,價格相對便宜一些,國內的話400多塊錢就能申請到一個,國外更是有免費的SSL證書可以申請。
在申請SSL證書時需要向CA機構提供網站域名,營業執照,以及申請人的身份信息等。網站的域名非常重要,申請人必須證明自己對域名有所有權,如果支持Hotmail.com,Gmail.com的SSL證書都可以隨便申請,黑客們就不用做假證書欺騙了。此外,一個證書一般只綁定一個域名,如果CA機構心情好的話,會免費再綁一個,比如你要申請域名時綁定的域名是guokr.com,那么只有在瀏覽器地址是https://guokr.com
的時候,這個證書才是受信任的,如果地址是https://www.guokr.com
或者https://login.guokr.com
,那么這個證書由于訪問的域名與證書綁定的域名不同,仍然會被瀏覽器顯示為不受信任的。CA機構也提供申請通配符域名(例如,*.guokr.com),通配符域名相當于綁定了主域名下的所有域名,因此使用起來非常方便,但是價格也超級昂貴,一個通配符域名一年大概得5000塊錢,只有企業才可以申請。下面就來看看一個證書的信息:
在訪問hotmail的時候會跳轉到login.live.com,這時IE瀏覽器上會有一個小鎖頭,點一下那個小鎖頭再點擊里面的“查看證書”就會出現上圖的證書窗口,這里面我們可以看到這個證書只有一個用途——向遠程計算機證明身份信息,證書的用途會有很多,SSL只是其中之一。在“頒發給”這一項就是這個證書在申請時綁定的域名;下面的“頒發者”是證書的頒發機構。最下面的兩個日期是證書申請時間以及過期的時間。這里我們可以注意一下“頒發者”的信息,里面有“Extended Validation SSL”的字樣,表明了這個證書是一個EV SSL證書(擴展驗證SSL證書),EV SSL證書有個特點就是可以讓瀏覽器的地址欄變綠,同時顯示出來證書所屬公司的名稱。EV SSL證書與其他的證書相比,費用更高。
以上說的是向CA機構申請證書的情況,如果個人網站只為加密傳輸也可以自己制作SSL證書,自己制作的證書不會受到瀏覽器的信任,在訪問的時候由于證書驗證失敗而給出警告。
證書以證書鏈的形式組織,在頒發證書的時候首先要有根CA機構頒發的根證書,再由根CA機構頒發一個中級CA機構的證書,最后由中級CA機構頒發具體的SSL證書。我們可以這樣理解,根CA機構就是一個公司,根證書就是他的身份憑證,每個公司由不同的部門來頒發不同用途的證書,這些不同的部門就是中級CA機構,這些中級CA機構使用中級證書作為自己的身份憑證,其中有一個部門是專門頒發SSL證書,當把根證書,中級證書,以及最后申請的SSL證書連在一起就形成了證書鏈,也稱為證書路徑。在驗證證書的時候,瀏覽器會調用系統的證書管理器接口對證書路徑中的所有證書一級一級的進行驗證,只有路徑中所有的證書都是受信的,整個驗證的結果才是受信。我們還是以login.live.com這個證書舉例,在查看證書的時候,點擊“證書路徑”標簽就會有下圖的顯示:
根證書是最關鍵的一個證書,如果根證書不受信任,它下面頒發的所有證書都不受信任。操作系統在安裝過程中會默認安裝一些受信任的CA機構的根證書,可以在“運行”里面運行“certmgr.msc”啟動證書管理器查看相關證書。
SSL證書驗證失敗有以下三點原因:
- SSL證書不是由受信任的CA機構頒發的
- 證書過期
- 訪問的網站域名與證書綁定的域名不一致
這也是我們在訪問有些網站時瀏覽器會彈出提示提示我們的信息。
所以在訪問HTTPS網站時需要注意如下的問題:
- 除非必要,不要隨意安裝根證書。安裝根證書的時候一定要明確證書的來源。當然這里有個網站要特別說明:對于12306.cn,一定要按照網站說的那樣,“為保障您順暢購票,請下載安裝根證書”。
- 對于網銀,在線支付,重要郵箱等網站,一定要確保SSL證書是沒有問題的,如果瀏覽器給出SSL證書錯誤的警告,一定要拒絕訪問。一些小區寬帶用戶一定要注意這點。
- 由于現在個人申請SSL證書比較便宜,一定要注意掛著合法SSL證書的釣魚網站(國外比較常見)。對于釣魚網站,一定要看清域名,另外別相信什么中獎的消息,同時要安裝帶有釣魚防護功能的安全軟件。
Fiddler抓HTTPS包的相關設置
介紹了這么多的HTTPS/SSL協議相關的內容之后我們要回到我們的正題Fiddler工具上了,今天的主題是使用Fiddler查看HTTPS流量,那么為什么要查看HTTPS流量呢?這個問題和為什么要使用Fiddler工具其實是一致的,我們使用Fiddler工具是為了查看、調試網絡流量,但是如果不做設置,我們的Fiddler是無法查看到HTTPS包的相關內容的。為了安全方面的考慮,許多的應用在傳遞敏感信息的時候會選用HTTPS協議來傳輸已確保數據的安全性(殺毒軟件和手機防護軟件也會檢查應用在傳遞敏感信息是是否使用了加密手段作為對該軟件安全評級的一個因素),當我們需要查看這些流量時就必須要開啟Fiddler的HTTPS debug功能了。
在Fiddler菜單中選擇Toos->Fiddler Options,打開HTTPS TAB:
-
勾選Capture HTTPS CONNECTS,會抓取CONNECT請求,CONNECT請求是HTTP協議中的請求方法中的一種(還有GET,POST,HEADER,PUSH等方法),其作用是建立一個直接通往目標服務器的TCP通道用于數據的傳輸,大多數http proxy支持CONNECT命令,但一般只支持CONNECT到外部服務器的443(https)端口。這是為了允許訪問外部的https服務。porxy對于CONNECT的連接是直接轉發,不做任何分析處理或緩存。客戶端訪問HTTPS請求會先向服務器發送一個CONNECT請求,建立與服務器通信的通道,后續的HTTPS內容的傳輸也會在這個通道內傳輸,開啟這個選項我們便能看到CONNECT請求了,在Fiddler中,它通常是這樣的:
-
然后勾選Decrypt HTTPS traffic選項,這時就開啟的了Fiddler抓取HTTPS包的功能,同時會自動安裝Fiddler根證書,根證書的作用我們上面已經詳述了,Fiddler具體怎么樣破解HTTPS流量的我們稍后詳談,我們先把這選項看完,點擊后會彈出對話框讓用戶確認,點擊Yes:
然后Windows會詢問用戶是否信任安裝的證書,選擇是:
此時PC上的Fiddler證書已經安裝完成,可以查看HTTPS流量了。 - Ignore server certificate errors選項可選可不選,作用是如果勾選了在服務器證書真的是不可靠的時候會報錯提醒,如果是debug自己的產品在ssl證書是自己構造的時候是可以勾上這個選項避免告警的
至此我們已經完成了Fiddler查看HTTPS報文的操作,是不是很簡單呢?那么為什么Fiddler能夠查看到HTTPS報文內部的內容呢?知乎上有一篇答案回復的比較詳細,我們一起來看一下,原文鏈接,答主:連山歸藏
首先fiddler截獲客戶端瀏覽器發送給服務器的https請求, 此時還未建立握手。
第一步, fiddler向服務器發送請求進行握手, 獲取到服務器的CA證書, 用根證書公鑰進行解密, 驗證服務器數據簽名, 獲取到服務器CA證書公鑰。
第二步, fiddler偽造自己的CA證書, 冒充服務器證書傳遞給客戶端瀏覽器, 客戶端瀏覽器做跟fiddler一樣的事。
第三步, 客戶端瀏覽器生成https通信用的對稱密鑰, 用fiddler偽造的證書公鑰加密后傳遞給服務器, 被fiddler截獲。
第四步, fiddler將截獲的密文用自己偽造證書的私鑰解開, 獲得https通信用的對稱密鑰。
第五步, fiddler將對稱密鑰用服務器證書公鑰加密傳遞給服務器, 服務器用私鑰解開后建立信任, 握手完成, 用對稱密鑰加密消息, 開始通信。
第六步, fiddler接收到服務器發送的密文, 用對稱密鑰解開, 獲得服務器發送的明文。再次加密, 發送給客戶端瀏覽器。
第七步, 客戶端向服務器發送消息, 用對稱密鑰加密, 被fidller截獲后, 解密獲得明文。由于fiddler一直擁有通信用對稱密鑰, 所以在整個https通信過程中信息對其透明。
簡單總結一下就是Fiddler用自己的被用戶信任過的根證書與客戶端通信,假裝自己是服務器,獲取到客戶端向服務器傳遞的信息,同時以客戶端的姿態以真實的證書向服務器請求數據,再把收到的數據已Fiddler證書加密后傳回給客戶端,其間所有的數據都是對Fiddler可見的,所以就就能夠解析出內容啦。
Android手機抓HTTPS包操作指南
Fiddler要能夠查看手機的HTTPS包根據我們前面對Fiddler抓HTTPS包原理的分析,我們需要在手機上安裝Fiddler證書即可,在安裝Fiddler后,我們的Fiddler會自動在PC機的相應端口(即上一講中在選項中設置的端口,默認8888)上建立一個網站,訪問
http://<PC機IP>:<Fiddler端口號>
可以打開一個網頁,這個網頁中最下面提供了鏈接就是Fiddler的證書下載,使用Android任意瀏覽器訪問這個頁面,點“FiddlerRoot certificate”:
然后彈出證書安裝菜單,隨意填寫名字:
Android系統為了安全性考慮,安裝自定義證書后需要啟用鎖屏密碼,設置一個即可
iPhone手機抓HTTPS包操作指南
IOS操作與Android類似,使用Safari訪問地址下載證書:
然后點擊安裝即可:
HTTPS丟包了怎么辦?
使用Fiddler抓HTTPS可能會遇到HTTPS丟包的情況,通常可以通過如下幾個方法解決:
- 查看手機代理是否設置正確
- 關閉PC機防火墻
- 重新安裝手機證書(最好刪除掉所有證書后安裝)
- 重裝FiddlerPC端證書(在Fiddler Options中的HTTPS Tab中,去勾選Capture HTTPS CONNECTs,然后點擊Remove Interception Certificates,重啟Fiddler再按照啟用HTTPS抓包的順序操作一次即可)
- 重裝Fiddler(刪除Program Files及我的文檔下的Fiddler2文件夾,重裝Fiddler,可能是Fiddler有Bug在以上辦法都不行時可以試試這個操作,記得備份自己的HOSTS,及自定義腳本插件等文件)