HTTPS是安全通道。如果瀏覽器導(dǎo)航欄前面有一個(gè)綠如A股的小鎖,那么感覺(jué)就會(huì)非常的放心。

把自己見(jiàn)不得人的小心思和污言穢語(yǔ),統(tǒng)統(tǒng)用這個(gè)小鎖鎖起來(lái),為所欲為,想想就讓人激動(dòng)。

但是等等,Charles為什么能抓到HTTPS的包呢?


(相關(guān)資料圖)

HTTPS簡(jiǎn)單原理

我們希望數(shù)據(jù)傳輸過(guò)程,對(duì)用戶來(lái)說(shuō)是個(gè)黑盒,對(duì)攻擊者來(lái)說(shuō)也是個(gè)黑盒。這主要體現(xiàn)在兩方面。

用戶不希望自己的敏感數(shù)據(jù)被獲取到。比如自己的賬號(hào)密碼,比如自己發(fā)給女友的聊騷數(shù)據(jù)。開(kāi)發(fā)者不希望自己的數(shù)據(jù)被用戶獲取到。比如自己的驗(yàn)簽方式,被破解了用戶就能干很多非法的事情。

HTTP協(xié)議屬于一問(wèn)一答的協(xié)議,在傳輸過(guò)程中是以明文方式傳遞的。

如果攻擊者截取了Web瀏覽器和網(wǎng)站服務(wù)器之間的傳輸報(bào)文,就可以直接讀懂其中的信息。比如通過(guò)代理方式或者局域網(wǎng)嗅探方式獲取了報(bào)文的內(nèi)容。

相關(guān)的工具有很多,比如wireshark、tcpdump、dsniff等。

但如果傳輸?shù)膬?nèi)容是加密的,那么即使你把所有的數(shù)據(jù)報(bào)文都抓到了,那么也沒(méi)有什么價(jià)值。

HTTPS就是一種傳輸加密數(shù)據(jù)的協(xié)議。如果我們?cè)赥CP與HTTP中間,加入一個(gè)TLS/SSL?層,那么就會(huì)變成HTTPS。

HTTPS包括握手階段和傳輸階段。其中握手階段是最重要的協(xié)商階段。

握手的目標(biāo),是安全的交換對(duì)稱密鑰,全程需要3個(gè)隨機(jī)數(shù)的參與。在Change Cipher Spec之后,傳輸?shù)木投际羌用芎蟮膬?nèi)容了。

這個(gè)過(guò)程可以使用WireShark抓包工具輕易抓取,有大量的文章分析握手過(guò)程,在此不再贅述。

當(dāng)然,HTTPS的效率是非常低的。這里稍微擴(kuò)展一下。

HTTP3,也就是谷歌的QUIC,除了解決了隊(duì)頭阻塞問(wèn)題,還可以作為TCP+TLS+HTTP/2?的一種替代方案。HTTP3默認(rèn)就是安全通道,采用UDP協(xié)議。在DH秘鑰交換算法的加持下,它可以減少連接建立時(shí)間 - 在常見(jiàn)情況下為 0 次RTT往返。

這比HTTPS的握手速度快多了。

Charles抓包

雖然HTTPS的傳輸過(guò)程是加密的,但如果我們就是請(qǐng)求的發(fā)起方,設(shè)備也在自己手里,去抓包HTTPS連接中的內(nèi)容,也是非常容易的。

這讓開(kāi)發(fā)者很頭疼。比如我使用云平臺(tái)提供的AK、SK直接發(fā)起HTTPS調(diào)用,用戶是能夠抓到這兩個(gè)關(guān)鍵密碼的。所以一般開(kāi)發(fā)者并不能直接把AK、SK在網(wǎng)絡(luò)上傳遞,即使這樣在功能上行得通。

我這里以在MacOS本機(jī)上抓包瀏覽器的HTTPS請(qǐng)求為例,來(lái)說(shuō)明Charles的使用。

啟動(dòng)Charles后,我們需要把它設(shè)置成系統(tǒng)代理。

然后,在Help/菜單下,找到Root證書(shū)進(jìn)行安裝。

安裝完畢之后,我們還要信任這個(gè)證書(shū)。這樣,當(dāng)你的瀏覽器訪問(wèn)我們的Charles代理時(shí),就可以暢通無(wú)阻。

安裝到System Keychains中,而且一定要信任它哦。

通常情況下,我訪問(wèn)一個(gè)HTTPS連接,抓到的內(nèi)容都是一團(tuán)糟。

我們還差最后一步。默認(rèn)情況下,Charles并沒(méi)有任何過(guò)濾,我么還需要把要抓包的網(wǎng)址,加入HTTPS的代理配置中才可以。

右鍵找到這個(gè)連接,然后選擇啟動(dòng)SSL代理即可。

此時(shí),我們?cè)倏匆幌逻@些連接的內(nèi)容,就能夠變成人眼能夠識(shí)別的了。

當(dāng)然,電腦上的代理沒(méi)有什么意義。我們做代理,一般是想要抓取手機(jī)上的應(yīng)用產(chǎn)生的請(qǐng)求。

但方法是一樣的,你只需要把這個(gè)Root證書(shū),安裝到你的手機(jī)中,然后信任它就可以了。

為什么能夠抓到數(shù)據(jù)?

在這個(gè)案例中,Charles是作為中間人而存在的。對(duì)于Charles來(lái)說(shuō),對(duì)于服務(wù)端的請(qǐng)求,是由它發(fā)起的。

你可以把它想象成一個(gè)瀏覽器,它發(fā)出的請(qǐng)求和返回的內(nèi)容,對(duì)于Charles自身來(lái)說(shuō)自然是可見(jiàn)的。欺騙服務(wù)器很容易,重要的欺騙客戶端。

Charles通過(guò)偽造一個(gè)CA證書(shū),來(lái)冒充一個(gè)服務(wù)端。當(dāng)瀏覽器或者移動(dòng)手機(jī)訪問(wèn)Charles冒充的服務(wù)端時(shí),Charles會(huì)攜帶CA證書(shū)返回給客戶端。

對(duì)于普通的CA證書(shū)來(lái)說(shuō),瀏覽器和客戶端是不信任的。這也是為什么要進(jìn)行HTTPS抓包,必須安裝CA證書(shū)的原因---我們需要把這個(gè)信任關(guān)系建立起來(lái)。

這兩部分是割裂的,可以說(shuō)是由兩條完全不同的SSL通道。請(qǐng)求報(bào)文在全程是加密的,除了一個(gè)非常薄弱的交接點(diǎn)。

在通道的粘合處,所有的信息卻是明文的。Charles掌控了這個(gè)過(guò)程,自然就能夠把原始信息展示出來(lái)。

End

可以看到,Charles是可以抓取到HTTPS的明文信息的。在中間人場(chǎng)景中,它既作為客戶端發(fā)起請(qǐng)求,也作為服務(wù)端接收請(qǐng)求,然后在請(qǐng)求的轉(zhuǎn)發(fā)處獲取數(shù)據(jù)。

作為用戶,我們千萬(wàn)不能隨意信任來(lái)歷不明的證書(shū),否則你的很多隱私數(shù)據(jù)將暴露在陽(yáng)光之下。

作為開(kāi)發(fā)者,也不能把敏感數(shù)據(jù)直接放在URL或者請(qǐng)求體里,防止用戶抓包獲取到這些信息,對(duì)服務(wù)造成破壞。

當(dāng)然,在CN,隱私可能是個(gè)偽命題。就比如xjjdog,雖然我一直在隱藏自己,但還是有很多朋友知道我到底是不是帶把的。

這個(gè)時(shí)候,HTTPS就沒(méi)什么用。

作者簡(jiǎn)介:小姐姐味道(xjjdog),一個(gè)不允許程序員走彎路的公眾號(hào)。聚焦基礎(chǔ)架構(gòu)和Linux。十年架構(gòu),日百億流量,與你探討高并發(fā)世界,給你不一樣的味道。

標(biāo)簽: HTTPS Charles