做这件事的好方法是什么?
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.raw
是urllib3.response.httpresponse
),但在许多情况下,这是不可能的。
这就是其中之一。看到证书的唯一对象是http.client.httpsconnection
(或urllib3.connectionpool.verifiedhttpsconnection
,但这只是前者的一个子类)和ssl.ssocket
,在请求返回时这两个对象都不存在了。(正如名称ConnectionPool
所暗示的那样,HttpsConnection
对象存储在池中,一旦完成就可以重用;SSLSocket
是HttpsConnection
的成员。)
因此,您需要修补东西,以便可以将数据复制到链上。可能就这么简单:
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)会引发错误并拒绝显示数据值。尽管这可能只是