項目最近由 http 轉成了 https, 但是charles 不能抓 https 的包,而搜各種資料去發現都因為 charles 版本過低無法用,所以記錄下我的解決辦法.
Charles為什么能抓 https?
都知道 http是明文傳輸,而 https 的出現就是為了解決這個問題,https 協議是由 SSL+http 協議構建的加密傳輸網絡協議.但既然是加密的,那為什么能抓到?
先看看 Charles 官網是怎么解釋的:
很明顯, "man-in-middle",就是使用中間人攻擊.
因為 https 使用的是非對稱加密,那就要了解https的傳輸交互過程:
1.首先是客戶端發起 https 請求,鏈接到server的443接口
2.服務端收到請求后把公鑰傳給客戶端
3.客戶端解析證書,如果沒有問題,用加密算法生成一個對稱密鑰,然后用公鑰加密
4.把加密后的值傳給服務端
5.服務端用私鑰解密后,之后的通信都是對已對稱密鑰進行加密和解密的通信
看起來很安全了吧,但中間人攻擊又是怎么做到的呢?
第一步,當客戶端發起 SSL握手時,中間人劫持用戶請求然后中間中偽裝客戶端發起 SSL握手.
第二步,服務端會發送公鑰給中間人,當然中間人是有一對自己的公鑰和私鑰,中間人會把中間人自己的公鑰發送給客戶端.
第三步,客戶端拿到公鑰會根據加密算法加密,發送對稱密鑰,這時候中間人利用自己的私鑰可以解出對稱密鑰,這時候中間人已經拿到公鑰和對稱密鑰,再用服務端發給中間人的公鑰來加密對稱密鑰,發送給服務器.
第四步,之后客戶端和服務端所有的請求的數據都會被中間人利用對稱密鑰解密得到所有的信息.
當然 charles 使用的中間人攻擊必須要我們要信任它的證書,不然還是不能得到數據,https是可以防止中間人攻擊的,因為服務器的公鑰是用證書的,
charles偽造的證書一般瀏覽器會警告,所以我們需要將charles的證書認為可靠的。從而實現中間人。
以上之后我了解的一點點的相關知識.
進入教程
Charles版本: V4.0.2
第一步:點擊install Charles Root Certificate, 之后會跳到鑰匙串
第二步:找到 Charles 的證書然后選擇使用此證書時: 始終信任.
第三步:在手機上安裝 Charles 的根證書
第四步:在手機上安裝完之后,回到 Charles-Proxy-SSLProxying Setting,
把需要劫持的 host加上,端口號443,注意這里的 host 可以使用通配符也可以直接填 host.
到這里就差不多教程就結束了,這次在 charles 上抓 https 只是工作中的一個小插曲,但是去了解為什么能抓到讓我產生興趣,在去深入了解的過程中也加深和修正了一些知識點,記錄為文.