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