使任何互联网访问 python 代码工作(代理 + 自定义 .crt)

make any internet-accessing python code work (proxy + custom .crt)

情况

如果未完成以下操作,所有使用 python 发出的传出 HTTP 或 HTTPS 请求将以 WinError 10054 连接重置或 SSL 错误握手错误结束。

  1. 设置 HTTP_PROXY、HTTPS_PROXY 环境变量,或其对应物
  2. 需要验证的内容必须使用自定义 .crt 文件进行验证。

例如,假设 .crt 文件就位,两者都会得到 200 OK:

import os
os.environ['HTTP_PROXY'] = #some_appropriate_address
os.environ['HTTPS_PROXY'] = #some appropriate_address
requests.get('http://www.google.com',verify="C:\the_file.crt") # 200 OK
requests.get('http://httpbin.org',verify=False) # 200 OK, but unsafe
requests.get('http://httpbin.org') # SSL bad handshake error

问题

我有大量混乱的预写代码(大量使用 urllib3 和请求以及可能的其他互联网访问代码),我必须使其在上述条件下工作。

当然,我可以为每个 requests.get()verify='C:\the_file.crt',但这很快就会变得毛茸茸,对吧?并且代码也可能正在使用其他一些库(不是请求)。所以我正在寻找一个 全局设置 (环境变量等)我应该改变,以便一切正常(return 200 OK 在 GET 请求到服务器时,代码是否写在 requests-py 中)。

另外,如果没有这种方法,我想解释一下为什么。

我尝试过的(正在尝试)

也许编辑 .condarc 文件(通过 conda --config)是一个解决方案。我试过了,但无济于事:python 给我一个 "SSL verification failed" 错误。相反,请注意上面的代码片段给了我一个200 OK。据我所知,这不太适合之前在 Stack Overflow 中讨论过的许多情况。

顺便说一句,将ssl_verify设置为false也没有解决问题;由于某种原因,我仍然收到错误的握手错误。

我正在使用 Win 10,Python 3.7.4 (Anaconda)。

更新

我已经编辑了这个问题,以防止将来对这个问题的内容产生误解。下面的一些答案是从一开始就在这里写的内容的重申。

目前的答案也不完全令人满意,因为它们似乎只解决了我使用 requestsurllib3.

的情况

根据请求中的文档:

https://requests.readthedocs.io/en/master/user/advanced/#proxies

你可以这样使用代理:

proxies = { 'http': 'http://10.10.1.10:3128', 'https': 'http://10.10.1.10:1080',} requests.get('http://example.org', proxies=proxies)

然后取决于你是想添加.crt还是.pem:

requests.get('https://kennethreitz.com', cert=('/path/server.crt', '/path/key'))

requests.get('https://kennethreitz.org', cert='/path/client.pem')

https://2.python-requests.org//en/v1.0.4/user/advanced/

您正在尝试向外部 url 发出 https 请求,您需要提供正确的证书文件以进行验证。您正在尝试在每个组件中进行这些配置。但我建议您在全局和系统范围内进行这些配置,这样两个组件都不需要提供证书和处理 ssl 验证的东西。

我在 windows 相关的网络配置方面很糟糕,但我建议你去检查 Proxifier 我很确定你可以使用适当的证书配置 ssl 代理。

您应该能够获得任何使用请求模块(位于 urllib3 内)的 python 代码在代理后面工作,而无需通过设置以下环境变量修改 python 代码本身在 Windows.

http_proxy           http://[<user>:<pwd>@]<http_host>:<http_port>  
https_proxy          http://[<user>:<pwd>@]<https_host>:<https_port>
requests_ca_bundle   <path_to_ca_bundle.crt>
curl_ca_bundle       <path_to_ca_bundle.crt>

您可以通过以下方式设置环境变量:

  • 按Windows-键+R,输入sysdm.cpl,3(注意逗号前的space)回车
  • 单击环境变量按钮
  • 在任一字段(用户变量或系统变量)中,添加四个变量