專案最近由 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 只是工作中的一個小插曲,但是去了解為什麼能抓到讓我產生興趣,在去深入瞭解的過程中也加深和修正了一些知識點,記錄為文.