当前位置: 首页 > 知识库问答 >
问题:

如何在Python中从请求中获得响应SSL证书?

穆俊名
2023-03-14

做这件事的好方法是什么?

共有1个答案

林绪
2023-03-14

requests故意包装像这样的低级内容。通常,您要做的唯一一件事就是验证证书是否有效。为此,只需传递verify=true。如果您想使用非标准的cacert包,您也可以通过它。例如:

resp = requests.get('https://example.com', verify=True, cert=['/path/to/my/ca.crt'])

此外,requests主要是围绕其他库的一组包装器,主要是urllib3和stdlib的http.client(对于2.x来说,httplib)和SSL

有时,答案只是获取较低级别的对象(例如,resp.rawurllib3.response.httpresponse),但在许多情况下,这是不可能的。

这就是其中之一。看到证书的唯一对象是http.client.httpsconnection(或urllib3.connectionpool.verifiedhttpsconnection,但这只是前者的一个子类)和ssl.ssocket,在请求返回时这两个对象都不存在了。(正如名称ConnectionPool所暗示的那样,HttpsConnection对象存储在池中,一旦完成就可以重用;SSLSocketHttpsConnection的成员。)

因此,您需要修补东西,以便可以将数据复制到链上。可能就这么简单:

HTTPResponse = requests.packages.urllib3.response.HTTPResponse
orig_HTTPResponse__init__ = HTTPResponse.__init__
def new_HTTPResponse__init__(self, *args, **kwargs):
    orig_HTTPResponse__init__(self, *args, **kwargs)
    try:
        self.peercert = self._connection.sock.getpeercert()
    except AttributeError:
        pass
HTTPResponse.__init__ = new_HTTPResponse__init__

HTTPAdapter = requests.adapters.HTTPAdapter
orig_HTTPAdapter_build_response = HTTPAdapter.build_response
def new_HTTPAdapter_build_response(self, request, resp):
    response = orig_HTTPAdapter_build_response(self, request, resp)
    try:
        response.peercert = resp.peercert
    except AttributeError:
        pass
    return response
HTTPAdapter.build_response = new_HTTPAdapter_build_response

这是未经测试的,所以没有保证;您可能需要修补的不止这些。

此外,子类和重写可能比monkeypatching更干净(特别是因为HttpAdapter被设计为子类)。

或者,更好的方法是分叉urllib3请求,修改您的分叉,并(如果您认为这样做合法有用的话)向上游提交请求。

无论如何,现在,从您的代码中,您可以这样做:

resp.peercert
 类似资料:
  • 问题内容: 尝试从中的响应获取SSL证书。 什么是这样做的好方法? 问题答案: 故意包装这样的低级内容。通常,您唯一要做的就是验证证书是否有效。为此,只需通过即可。如果要使用非标准的cacert捆绑包,也可以通过。例如: 另外,主要是围绕其他库的一组包装器,主要是stdlib的(或对于2.x而言)和。 有时候,答案是只是为了获得在较低级别的对象(例如,是),但在许多情况下,这是不可能的。 这就是其

  • 问题内容: 我有两个Python脚本。一种使用Urllib2库,另一种使用Requests库。 我发现请求更容易实现,但是找不到urlib2的等效函数。例如: 建立完发布网址后,请给我内容-我正尝试连接到vcloud Director api实例,并且响应显示了我有权访问的端点。但是,如果我按以下方式使用请求库.... .... the和不返回任何内容,即使请求后调用中的状态代码等于200。 为什

  • 问题内容: 如果URL使用自签名证书,则失败并显示 我知道我可以像这样传递给参数: 但是,我想做的是将请求指向磁盘上的公共密钥副本,并告诉它信任该证书。 问题答案: 尝试:

  • 我正在尝试为NBA数据创建一个网络刮板。当我运行以下代码时: 请求因错误而超时: 文件“C:\ProgramData\Anaconda3\lib\site packages\requests\api.py”,第70行,在get返回请求中('get',url,params=params,**kwargs) 文件“C:\ProgramData\Anaconda3\lib\site packages\r

  • 问题内容: 我有一个包含表单(帖子)的html。单击某些提交按钮时,我会收到JSON响应。 如何获取此JSON? 如果我不截取请求,则json将显示在Web视图上,所以我想应该使用(我正在使用API​​ 12),但是我不知道如何在其中获取json。 还是有更好的方法,例如拦截响应而不是请求? 谢谢 问题答案: 您应该重写的方法

  • 问题内容: 在一个Node.js项目中,我试图从S3取回数据。 当我使用时,一切正常: 我的参数是: 如果将URL输出带到控制台并将其粘贴到Web浏览器中,它将下载所需的文件。 但是,如果我尝试使用,则会出现各种奇怪的行为。我相信我只是使用不正确。这是我尝试过的: 输出: 因此看来这工作正常。但是,当我在s 之一上设置断点时,我的IDE(NetBeans)会引发错误并拒绝显示数据值。尽管这可能只是