使用 charles 代理检查 HTTPS 的 Python 请求

Posted

技术标签:

【中文标题】使用 charles 代理检查 HTTPS 的 Python 请求【英文标题】:check Python requests with charles proxy for HTTPS 【发布时间】:2015-03-06 00:27:32 【问题描述】:

我想使用 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

【问题讨论】:

【参考方案1】:

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

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

requests.get(endpoint_url, verify='/path/to/file.crt')

有关详细信息,请参阅请求的文档:https://2.python-requests.org/en/v1.1.0/user/advanced/#ssl-cert-verification


顺便说一句,当使用 Charles Proxy 进行本地调试时,我发现使用 Request 的能力通过 REQUESTS_CA_BUNDLE 环境变量指定“.crt”的路径更有效。

在 shell 中运行类似以下的内容,无需为每个 Requests 调用指定 Charles 的“.crt”路径:

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

【讨论】:

您可以通过 Help > SSL Proxying > Save Charles Root Certificate...获取 Charles Proxy 证书... 默认的 .pem 格式适用于 Requests。

以上是关于使用 charles 代理检查 HTTPS 的 Python 请求的主要内容,如果未能解决你的问题,请参考以下文章

windows charles response 乱码解决办法

像 Charles 这样的 HTTPS 代理

Charles和fiddler

关于Charles手机设置好代理后,无法上网的问题

Charles如何配置代理抓去HTTP/HTTPS请求

charles代理以及关于其抓取https信息的操作