使任何internet访问python代码正常工作(proxy+;custom.crt) 形势
如果未执行以下操作,则使用python发出的所有传出HTTP或HTTPS请求将以WinError 10054连接重置或SSL错误握手结束使任何internet访问python代码正常工作(proxy+;custom.crt) 形势,python,http-proxy,Python,Http Proxy,如果未执行以下操作,则使用python发出的所有传出HTTP或HTTPS请求将以WinError 10054连接重置或SSL错误握手结束 设置HTTP\U PROXY、HTTPS\U PROXY环境变量或它们的对应项 需要验证的内容必须使用自定义的.crt文件进行验证 例如,假设.crt文件已就位,两者都会给我一个200ok: import os os.environ['HTTP_PROXY'] = #some_appropriate_address os.environ['HTTPS_PROX
200ok
:
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和请求以及可能的其他internet访问代码),我必须使其在上述条件下工作
当然,我可以为每个请求编写verify='C:\u file.crt'
。get()
,但这很快就会让人毛骨悚然,对吗?代码也可能正在使用其他库(不是请求)。因此,我正在寻找一个应该更改的全局设置(环境变量等),以便一切都能正常工作(在向服务器发出GET请求时返回200 OK,无论代码是否以请求的形式编写)
此外,如果没有这种办法,我想解释一下原因
我所尝试的(正在尝试的)
也许编辑.condarc文件(通过conda--config
)是一种解决方案。我尝试了,但没有成功:python给了我一个“SSL验证失败”错误。相反,请注意上面的代码片段给了我一个200ok
。据我所知,这与之前在堆栈溢出中讨论的许多情况不太相符
顺便说一下,将ssl_verify设置为false
也不能解决问题;由于某种原因,我仍然会收到一个糟糕的握手错误
我使用的是Win10,Python 3.7.4(Anaconda)
更新
我对问题进行了编辑,以防止将来对该问题的内容产生误解。下面的几个答案是从一开始就在这里写的东西的重复
当前的答案也不完全令人满意,因为它们似乎只解决了我正在使用
请求
或urllib3
的情况,根据Doc in requests:
您可以通过以下方式使用代理:
proxies={'http':'http://10.10.1.10:3128','https':'http://10.10.1.10:1080',}
请求。获取('http://example.org,代理=代理)
然后取决于您是否要添加.crt
或.pem
:
requests.get('https://kennethreitz.com,cert=('/path/server.crt','/path/key'))
requests.get('https://kennethreitz.org,cert='/path/client.pem')
您正试图向外部url发出https请求,需要提供适当的证书文件进行验证。您正试图在每个组件内进行这些配置。但我建议您在全球和系统范围内进行这些配置,这样两个组件都不需要提供证书和处理ssl验证内容
我对与windows相关的网络配置很差,但我建议您去检查一下,我很确定您可以使用正确的证书配置ssl代理。您应该能够获得使用请求模块(位于urllib3内)的任何python代码通过在Windows中设置以下环境变量,在不修改python代码本身的情况下在代理后面工作
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>
http\u代理http://[:@]:
https_代理http://[:@]:
请求\u ca\u包
卷曲束
可以通过执行以下操作设置环境变量:
- 按Windows键+R,输入sysdm.cpl,3(注意逗号前的空格),然后按enter键
- 单击环境变量按钮
- 在任一字段(用户变量或系统变量)中,添加四个变量
https\u proxy
。@tripleee-nope,仍然会给我一个SSL错误握手错误。curl命令在命令行上有效吗?@wishmaster curl:(35)schannel:接收握手失败,SSL/TLS连接失败假定您可以ping网站,尝试请求。获取('http://httpbin.org,verify=False)
并在问题中发布错误谢谢您的回答!然而,我的问题的措辞可能会引起一些误解。我将在接下来的24小时内编辑我的问题,以确保不再发生此类误解。当我这样做时,我将删除/重新发布或编辑此评论,以便通知您。对于给您带来的不便,我深表歉意。对于延误,我深表歉意-修复了问题;请看一看。你的回答部分重复了这个问题,100%不是我想要的;我在上一版本中已经说过,我需要一个全局设置。为了避免进一步的误解,我缩短了问题的篇幅,同时保留了所有的核心内容。一旦我在周一开始工作,这项工作奏效,我将立即交出奖金。非常感谢你!只是补充一下,其他一些工具可能有不同的配置。例如,如果使用TensorFlow数据集:tf.data.Dataset,则需要设置其他环境变量:export-TFDS\u-CA\u BUNDLE=path/CA\u-certs,export-TFDS\u-HTTPS\u-PROXY=“”,export-TFDS\u-HTTP\u-PROXY=“”使用代理并不容易。我从去年开始在一家使用代理的公司做ML,我可能几乎每天都对代理有意见。祝你好运