問題分析
在進行某些APP的抓包時,有時會遇到即使信任了抓包軟件的CA根證書也無法抓包的情況。這是因為一些APP采用了"SSL Pinning"技術,只信任代碼中認為可信的證書。雖然我對逆向工程不太擅長,但我可以嘗試用Python來模擬類似的技術。
解決方案
真正的SSL Pinning通常是通過預置網(wǎng)站所使用的根證書或中間證書來實現(xiàn)的。這樣即使證書過期或更換,也能繼續(xù)驗證。
但我認為沒有必要這么麻煩。一般Python程序連接的后端也不必在瀏覽器中調用,可以自簽一個證書,然后自行驗證。
因為中間人攻擊重新簽署的公鑰證書的指紋與原始網(wǎng)站的不同,可利用這一點判斷是否被抓包。
在Python中,一般使用requests庫進行請求,而不是直接使用socket和ssl包。
我查了一下資料,發(fā)現(xiàn)有一些方法可以實現(xiàn)這個功能。
但是,用socket操作相對繁瑣,于是我嘗試詢問AI,結果并不理想。
最終,我在Stack Overflow上找到了一些討論,根據(jù)其建議,對代碼進行了簡單修改,最終實現(xiàn)了所需功能。
import requests import hashlib HTTPSConnection = requests.packages.urllib3.connection.HTTPSConnection orig_HTTPSConnection_connect = HTTPSConnection.connect def new_HTTPSConnection_connect(self): orig_HTTPSConnection_connect(self) try: self.peer_certificate = self.sock.getpeercert(binary_form=True) except AttributeError: pass HTTPSConnection.connect = new_HTTPSConnection_connect def verify_cert_request(url): with requests.get(url, stream=True, verify=False) as r: result = [hashlib.sha256(r.raw.connection.sock.getpeercert(binary_form=True)).hexdigest(), r.text] return result result = verify_cert_request('https://www.baidu.com') print(result[0]) print(result[1][:10])
使用這段代碼,可以獲取請求網(wǎng)站的證書指紋。如果不希望被抓包,可以先計算自己證書的hash指紋,在代碼中判斷請求網(wǎng)站的指紋是否與自己的相符。若不符,可考慮采取進一步反制措施。
總結
雖然Python作為解釋型語言,代碼相對容易查看,但這并不意味著不受保護。即使使用Cython加殼等方法,依然可能暴露源代碼。一種可能的防御方法是修改依賴的庫,使其返回正確的結果,以防止大多數(shù)抓包者的攻擊。文章來源:http://www.zghlxwxcb.cn/article/748.html
文章來源地址http://www.zghlxwxcb.cn/article/748.html
到此這篇關于如何使用Python requests庫驗證證書的文章就介紹到這了,更多相關內容可以在右上角搜索或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!