问题分析
在进行某些APP的抓包时,有时会遇到即使信任了抓包软件的CA根证书也无法抓包的情况。这是因为一些APP采用了"SSL Pinning"技术,只信任代码中认为可信的证书。虽然我对逆向工程不太擅长,但我可以尝试用Python来模拟类似的技术。
解决方案
真正的SSL Pinning通常是通过预置网站所使用的根证书或中间证书来实现的。这样即使证书过期或更换,也能继续验证。
但我认为没有必要这么麻烦。一般Python程序连接的后端也不必在浏览器中调用,可以自签一个证书,然后自行验证。
因为中间人攻击重新签署的公钥证书的指纹与原始网站的不同,可利用这一点判断是否被抓包。
在Python中,一般使用requests库进行请求,而不是直接使用socket和ssl包。
我查了一下资料,发现有一些方法可以实现这个功能。
但是,用socket操作相对繁琐,于是我尝试询问AI,结果并不理想。
最终,我在Stack Overflow上找到了一些讨论,根据其建议,对代码进行了简单修改,最终实现了所需功能。
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])
使用这段代码,可以获取请求网站的证书指纹。如果不希望被抓包,可以先计算自己证书的hash指纹,在代码中判断请求网站的指纹是否与自己的相符。若不符,可考虑采取进一步反制措施。
总结
虽然Python作为解释型语言,代码相对容易查看,但这并不意味着不受保护。即使使用Cython加壳等方法,依然可能暴露源代码。一种可能的防御方法是修改依赖的库,使其返回正确的结果,以防止大多数抓包者的攻击。文章来源:https://www.toymoban.com/diary/python/748.html
文章来源地址https://www.toymoban.com/diary/python/748.html
到此这篇关于如何使用Python requests库验证证书的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!