背景
作為移動平臺的RD迅腔,項(xiàng)目開發(fā)過程中一項(xiàng)比較重要的甩鍋技能——抓包應(yīng)該大家都比較熟悉了牍帚,畢竟有些bug可能是由服務(wù)端下發(fā)的數(shù)據(jù)出錯導(dǎo)致的银伟。雖然抓包工具很好用伍伤,但是如果不做一些設(shè)置的話并徘,對于HTTPS協(xié)議的請求就無能為力了,比如這樣
這對于一些注重安全性的應(yīng)用來說扰魂,或許就不是特別好使麦乞,我們的項(xiàng)目目前也在逐漸從HTTP轉(zhuǎn)向HTTPS蕴茴,因此掌握這些技巧還是比較有用的。抓包工具多種多樣姐直,比較好使的還是Charles和Fiddler倦淀,下面就簡單的介紹下HTTPS的相關(guān)原理并以Charles為例來介紹下如何抓取HTTPS協(xié)議的包。
原理分析
其實(shí)使用工具抓HTTPS的包本身并不難声畏,兩三步簡單的操作就可以實(shí)現(xiàn)撞叽,關(guān)鍵如果不理解原理的話,總覺得不舒服斯基插龄,所以把原理分析放在前面愿棋。
HTTPS(Hyper Text Transfer Protocol Secure),是一種基于SSL/TLS的HTTP均牢,所有的HTTP數(shù)據(jù)都是在SSL/TLS協(xié)議封裝之上進(jìn)行傳輸?shù)目酚辍TTPS協(xié)議是在HTTP協(xié)議的基礎(chǔ)上,添加了SSL/TLS握手以及數(shù)據(jù)加密傳輸徘跪,也屬于應(yīng)用層協(xié)議甘邀。所以,研究HTTPS協(xié)議原理垮庐,最終就是研究SSL/TLS協(xié)議松邪。
運(yùn)行過程
我們都知道HTTPS在保證數(shù)據(jù)安全傳輸上使用了加密算法,但是具體是如何加密的哨查,或許許多人和我一樣也是云里霧里逗抑。
實(shí)際上SSL/TLS協(xié)議的基本思路是非對稱加密和對稱加密結(jié)合來傳輸數(shù)據(jù),一言以弊之解恰,HTTPS是通過一次非對稱加密算法(如RSA算法)進(jìn)行了協(xié)商密鑰的生成與交換锋八,然后在后續(xù)通信過程中就使用協(xié)商密鑰進(jìn)行對稱加密通信,之所以要使用這兩種加密方式的原因在于非對稱加密計(jì)算量較大护盈,如果一直使用非對稱加密來傳輸數(shù)據(jù)的話挟纱,會影響效率。
運(yùn)行過程盜用巨人的圖腐宋,可以表示如下
有了圖就可以一步一步分析了
1.HTTPS請求
這個步驟是整個通信過程中的第一步紊服,首先,客戶端(通常是瀏覽器)先向服務(wù)器發(fā)出加密通信的請求胸竞,在這一步中欺嗤,客戶端主要向服務(wù)器提供以下信息:
- 支持的協(xié)議版本,比如TLS 1.0版
- 一個客戶端生成的隨機(jī)數(shù)RandomC卫枝,稍后用于生成“協(xié)商密鑰”煎饼。
- 支持的加密方法,比如RSA公鑰加密校赤。
- 支持的壓縮方法吆玖。
2.服務(wù)器響應(yīng)
服務(wù)器收到客戶端請求后筒溃,向客戶端發(fā)出回應(yīng),服務(wù)器的回應(yīng)一般包含以下內(nèi)容:
- 確認(rèn)使用的加密通信協(xié)議版本沾乘,比如TLS 1.0版本怜奖。如果瀏覽器與服務(wù)器支持的版本不一致,服務(wù)器關(guān)閉加密通信翅阵。
- 一個服務(wù)器生成的隨機(jī)數(shù)RandomS歪玲,稍后用于生成“協(xié)商密鑰”*。
- 從客戶端支持的加密方法中選擇一個作為確認(rèn)要使用的加密方法掷匠,比如RSA公鑰加密滥崩。
- 服務(wù)器證書。
這個服務(wù)器證書就是表明服務(wù)器身份的東西槐雾,其中也包含了非對稱加密中需要使用的公鑰夭委。
3.證書校驗(yàn)幅狮、生成密碼募强、公鑰加密
客戶端收到服務(wù)器回應(yīng)以后,首先驗(yàn)證服務(wù)器返回的證書崇摄。如果證書不是可信機(jī)構(gòu)頒發(fā)擎值,或者證書中的域名與實(shí)際域名不一致,或者證書已經(jīng)過期逐抑,以瀏覽器為例客戶端會向網(wǎng)頁訪問者顯示一個警告鸠儿,由其選擇是否還要繼續(xù)通信。 如果證書沒有問題厕氨,客戶端就會從證書中取出服務(wù)器的公鑰进每。然后生成密碼、公鑰加密命斧。
生成密碼的過程會先產(chǎn)生一個隨機(jī)數(shù)Pre-master key田晚,該隨機(jī)數(shù)是整個握手階段出現(xiàn)的第三個隨機(jī)數(shù),稍后會經(jīng)過公鑰加密發(fā)送到服務(wù)端国葬,有了它以后贤徒,客戶端和服務(wù)器就同時有了三個隨機(jī)數(shù)——RandomC,RandomS汇四,Pre-master key接奈,接著雙方就用事先商定的加密方法,各自生成本次會話所用的同一把“協(xié)商密鑰”通孽。
4.加密信息C-S
加密信息是指上面一步生成的內(nèi)容序宦,主要包括
- 一個隨機(jī)數(shù)Pre-master key。用于給服務(wù)端生成“協(xié)商密鑰”背苦。
- 編碼改變通知互捌,表示隨后的信息都將用雙方商定的加密方法和密鑰發(fā)送堡僻。
- 客戶端握手結(jié)束通知,表示客戶端的握手階段已經(jīng)結(jié)束疫剃。這一項(xiàng)通常也是前面發(fā)送的所有內(nèi)容的hash值钉疫,用來供服務(wù)器校驗(yàn)。
5.私鑰解密巢价、解密握手消息牲阁、驗(yàn)證Hash
服務(wù)器收到客戶端公鑰加密的第三個隨機(jī)數(shù)Pre-master key之后,通過自身私鑰解密該數(shù)值并由之前的RandomC和RandomS計(jì)算生成本次會話所用的“會話密鑰”壤躲。然后城菊,通過約定的Hash算法驗(yàn)證客戶端發(fā)送的數(shù)據(jù)完整性。
6.加密信息S-C
主要是指
- 編碼改變通知碉克,表示隨后的信息都將用雙方商定的加密方法和密鑰發(fā)送凌唬。
- 服務(wù)器握手結(jié)束通知,表示服務(wù)器的握手階段已經(jīng)結(jié)束漏麦。這一項(xiàng)同時也是前面發(fā)生的所有內(nèi)容的hash值客税,用來供客戶端校驗(yàn)。
7.解密握手消息撕贞、驗(yàn)證Hash
客戶端解密并計(jì)算握手消息的HASH更耻,如果與服務(wù)端發(fā)來的HASH一致,此時握手過程結(jié)束捏膨。
8.正常加密通信
握手成功之后秧均,所有的通信數(shù)據(jù)將由之前協(xié)商密鑰及約定好的算法進(jìn)行加密解密。
Charles抓HTTPS包原理
Charles本身是一個協(xié)議代理工具号涯,如果只是普通的HTTP請求目胡,因?yàn)閿?shù)據(jù)本身沒經(jīng)過再次加密,因此作為代理可以知道所有客戶端發(fā)送到服務(wù)端的請求內(nèi)容以及服務(wù)端返回給客戶端的數(shù)據(jù)內(nèi)容链快,這也就是抓包工具能夠?qū)?shù)據(jù)傳輸內(nèi)容直接展現(xiàn)出來的原因誉己。對于HTTPS請求,4久又,6巫延,8步驟的數(shù)據(jù)都已經(jīng)經(jīng)過了加密,代理如果什么都不做的話是無法獲取到其中的內(nèi)容的地消。為了實(shí)現(xiàn)這個過程的數(shù)據(jù)獲取炉峰,Charles需要做的事情是對客戶端偽裝服務(wù)端,對服務(wù)端偽裝客戶端脉执,具體
- 截獲真實(shí)客戶端的HTTPS請求疼阔,偽裝客戶端向真實(shí)服務(wù)端發(fā)送HTTPS請求
- 接受真實(shí)服務(wù)器響應(yīng),用Charles自己的證書偽裝服務(wù)端向真實(shí)客戶端發(fā)送數(shù)據(jù)內(nèi)容
一般情況下HTTPS中是客戶端對服務(wù)端做證書校驗(yàn),當(dāng)然也有一些金融機(jī)構(gòu)會有用戶證書作為提供給服務(wù)端做用戶認(rèn)證的工具婆廊,保證發(fā)出請求的的確是這部分授權(quán)用戶迅细。我們僅分析客戶端對服務(wù)單做證書校驗(yàn)的這種。Android有自己的一套HTTPS通信調(diào)用方式淘邻,以HttpsURLConnection為例
上面這段代碼就是一個https請求的樣例茵典,這種方法的特點(diǎn)是證書校驗(yàn)工作交由系統(tǒng)處理,系統(tǒng)只會允許可信CA簽發(fā)的數(shù)字證書能夠訪問宾舅,私有CA簽發(fā)的數(shù)字證書(比如12306以及我們上文說的Charles證書)是無法訪問的统阿。
那么如何繞過呢,
- 第一種方法是修改Https通信代碼筹我,這種只對開發(fā)者開發(fā)應(yīng)用的時候好使扶平,我們需要實(shí)現(xiàn)X509TrustManager接口去做自己的一套證書校驗(yàn),它并不通用蔬蕊,尤其是對于我們抓包而言是不可行的结澄,因?yàn)槲覀儧]法去修改別人應(yīng)用中的代碼。
- 第二種方法是將私有CA簽發(fā)的數(shù)字證書安裝到手機(jī)中并且作為受信任證書保存岸夯,這種方式是我們推薦的方式麻献,唯一的缺點(diǎn)是你的手機(jī)上可能會在通知欄一直留著一個特殊標(biāo)志,告訴你網(wǎng)絡(luò)可能被監(jiān)控囱修。恩赎瑰,不監(jiān)控我們怎么抓包呢王悍,哈哈破镰。
Charles抓包步驟
原理都說完了,下面就是貼圖時間压储,我們要做的最重要的其實(shí)只有一件事情鲜漩,就是
將私有CA簽發(fā)的數(shù)字證書安裝到手機(jī)中并且作為受信任證書保存
一步一步來
- 首先打開Charles菜單,選擇安裝Charles證書到移動設(shè)備
- Charles提示你如何安裝集惋,這里如何用手機(jī)連接Charles就不做敘述了孕似,普通的HTTP抓包都需要執(zhí)行
- 手機(jī)上打開http://charlesproxy.com/getssl,系統(tǒng)提示安裝證書刮刑,安裝完成之后通知欄告知網(wǎng)絡(luò)受到監(jiān)控
device-2017-01-25-111551.png - 選擇Proxy-SSL Proxying Settings喉祭,設(shè)置啟用SSL代理能力,并自行Add需要抓取的服務(wù)地址