如何使用Python requests库验证证书

2,127次阅读
没有评论

共计 1619 个字符,预计需要花费 5 分钟才能阅读完成。

Python requests 库验证证书方法

问题分析

在进行某些 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

到此这篇关于如何使用 Python requests 库验证证书的文章就介绍到这了, 更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持 TOY 模板网!

原文地址:https://www.toymoban.com/diary/python/748.html

如若转载,请注明出处:如若内容造成侵权 / 违法违规 / 事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于1970-01-01发表,共计1619字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)