項目最近由 http 轉(zhuǎn)成了 https, 但是charles 不能抓 https 的包,而搜各種資料去發(fā)現(xiàn)都因為 charles 版本過低無法用,所以記錄下我的解決辦法.
Charles為什么能抓 https?
都知道 http是明文傳輸,而 https 的出現(xiàn)就是為了解決這個問題,https 協(xié)議是由 SSL+http 協(xié)議構(gòu)建的加密傳輸網(wǎng)絡(luò)協(xié)議.但既然是加密的,那為什么能抓到?
先看看 Charles 官網(wǎng)是怎么解釋的:

很明顯, "man-in-middle",就是使用中間人攻擊.
因為 https 使用的是非對稱加密,那就要了解https的傳輸交互過程:

1.首先是客戶端發(fā)起 https 請求,鏈接到server的443接口
2.服務(wù)端收到請求后把公鑰傳給客戶端
3.客戶端解析證書,如果沒有問題,用加密算法生成一個對稱密鑰,然后用公鑰加密
4.把加密后的值傳給服務(wù)端
5.服務(wù)端用私鑰解密后,之后的通信都是對已對稱密鑰進行加密和解密的通信
看起來很安全了吧,但中間人攻擊又是怎么做到的呢?
第一步,當客戶端發(fā)起 SSL握手時,中間人劫持用戶請求然后中間中偽裝客戶端發(fā)起 SSL握手.
第二步,服務(wù)端會發(fā)送公鑰給中間人,當然中間人是有一對自己的公鑰和私鑰,中間人會把中間人自己的公鑰發(fā)送給客戶端.
第三步,客戶端拿到公鑰會根據(jù)加密算法加密,發(fā)送對稱密鑰,這時候中間人利用自己的私鑰可以解出對稱密鑰,這時候中間人已經(jīng)拿到公鑰和對稱密鑰,再用服務(wù)端發(fā)給中間人的公鑰來加密對稱密鑰,發(fā)送給服務(wù)器.
第四步,之后客戶端和服務(wù)端所有的請求的數(shù)據(jù)都會被中間人利用對稱密鑰解密得到所有的信息.
當然 charles 使用的中間人攻擊必須要我們要信任它的證書,不然還是不能得到數(shù)據(jù),https是可以防止中間人攻擊的,因為服務(wù)器的公鑰是用證書的,
charles偽造的證書一般瀏覽器會警告,所以我們需要將charles的證書認為可靠的。從而實現(xiàn)中間人。
以上之后我了解的一點點的相關(guān)知識.
進入教程
Charles版本: V4.0.2
第一步:點擊install Charles Root Certificate, 之后會跳到鑰匙串

第二步:找到 Charles 的證書然后選擇使用此證書時: 始終信任.

第三步:在手機上安裝 Charles 的根證書

第四步:在手機上安裝完之后,回到 Charles-Proxy-SSLProxying Setting,
把需要劫持的 host加上,端口號443,注意這里的 host 可以使用通配符也可以直接填 host.

到這里就差不多教程就結(jié)束了,這次在 charles 上抓 https 只是工作中的一個小插曲,但是去了解為什么能抓到讓我產(chǎn)生興趣,在去深入了解的過程中也加深和修正了一些知識點,記錄為文.