使用charles proxy检查Python请求以获取HTTPS

使用charles proxy检查Python请求以获取HTTPS,python,request,charles-proxy,Python,Request,Charles Proxy,我想使用charles代理调试一些python请求 我需要在电话中包括charles的证书,但不工作 import requests endpoint_url = 'https://www.httpsnow.org/' r = requests.get(endpoint_url, verify=True, cert='/Users/iosdev/DopPy/charles.crt') print "empexo" print r 我在Charles上添加了https地址 我了解查尔斯: SS

我想使用charles代理调试一些python请求

我需要在电话中包括charles的证书,但不工作

import requests
endpoint_url = 'https://www.httpsnow.org/'
r = requests.get(endpoint_url, verify=True, cert='/Users/iosdev/DopPy/charles.crt')

print "empexo"
print r
我在Charles上添加了https地址

我了解查尔斯:

SSLHandshake:握手期间远程主机关闭连接

并且在python日志中出现错误

empexo
Traceback (most recent call last):
  File "/Users/iosdev/DopPy/GetCelebs.py", line 15, in <module>
    r = requests.get(endpoint_url, verify=True, cert='/Users/iosdev/DopPy/charles.crt')
  File "/Users/iosdev/VenvPY26/lib/python2.6/site-packages/requests/api.py", line 65, in get
    return request('get', url, **kwargs)
  File "/Users/iosdev/VenvPY26/lib/python2.6/site-packages/requests/api.py", line 49, in request
    response = session.request(method=method, url=url, **kwargs)
  File "/Users/iosdev/VenvPY26/lib/python2.6/site-packages/requests/sessions.py", line 461, in request
    resp = self.send(prep, **send_kwargs)
  File "/Users/iosdev/VenvPY26/lib/python2.6/site-packages/requests/sessions.py", line 573, in send
    r = adapter.send(request, **kwargs)
  File "/Users/iosdev/VenvPY26/lib/python2.6/site-packages/requests/adapters.py", line 431, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: [Errno 336265225] _ssl.c:341: error:140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM lib

Process finished with exit code 1
empexo
回溯(最近一次呼叫最后一次):
文件“/Users/iosdev/DopPy/GetCelebs.py”,第15行,在
r=requests.get(endpoint_url,verify=True,cert='/Users/iosdev/DopPy/charles.crt')
文件“/Users/iosdev/VenvPY26/lib/python2.6/site packages/requests/api.py”,get中的第65行
返回请求('get',url,**kwargs)
文件“/Users/iosdev/VenvPY26/lib/python2.6/site packages/requests/api.py”,请求中的第49行
response=session.request(方法=method,url=url,**kwargs)
文件“/Users/iosdev/VenvPY26/lib/python2.6/site packages/requests/sessions.py”,请求中的第461行
resp=自我发送(准备,**发送)
文件“/Users/iosdev/VenvPY26/lib/python2.6/site packages/requests/sessions.py”,第573行,在send中
r=适配器.send(请求,**kwargs)
文件“/Users/iosdev/VenvPY26/lib/python2.6/site packages/requests/adapters.py”,第431行,在send中
raise SSLError(e,请求=请求)
requests.exceptions.SSLError:[Errno 336265225]\u ssl.c:341:error:140B0009:ssl例程:ssl\u CTX\u use\u PrivateKey\u文件:PEM lib
进程已完成,退出代码为1

我在解决类似问题时发现了此线程。在这个场景中,我遇到了使用
cert
参数来定义“.crt”文件的路径,而本应使用
verify
参数

正确的用法最终看起来像:

requests.get(endpoint_url, verify='/path/to/file.crt')
有关更多详细信息,请参阅请求文档:


另一方面,我发现在使用Charles Proxy进行本地调试时,使用Request的功能通过
REQUESTS\u CA\u BUNDLE
环境变量指定“.crt”的路径更有效

在shell中运行类似于以下内容的操作可以避免为每个请求调用指定Charles“.crt”的路径:

REQUESTS_CA_BUNDLE=/path/to/file.crt
export REQUESTS_CA_BUNDLE

您可以通过帮助>SSL代理>保存Charles根证书获取Charles代理证书。。。默认的.pem格式适用于请求。