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