2013-01-18 62 views
8

自从我开始为此寻找解决方案以来,这已经过去了几天。Python请求SSL问题

我一直在尝试使用请求通过代理进行https请求,但没有运气。

Altough这包括在我的一个大项目之前,都做这样的:

import requests 

    prox = 'xxx.xxx.xxx.xxx:xxx' # fill in valid proxy 

    r = requests.get('https://ipdb.at', proxies={'http': prox, 
               'https': prox}) 

我试过kward验证=假,但我不断收到同样的错误或它的变化:

Traceback (most recent call last): 
     File "/Users/mg/Desktop/proxy_service.py", line 21, in <module> 
     verify=False) 
     File "/Library/Python/2.7/site-packages/requests/api.py", line 55, in get 
     return request('get', url, **kwargs) 
     File "/Library/Python/2.7/site-packages/requests/api.py", line 44, in request 
     return session.request(method=method, url=url, **kwargs) 
     File "/Library/Python/2.7/site-packages/requests/sessions.py", line 279, in request 
     resp = self.send(prep, stream=stream, timeout=timeout, verify=verify, cert=cert, proxies=proxies) 
     File "/Library/Python/2.7/site-packages/requests/sessions.py", line 374, in send 
     r = adapter.send(request, **kwargs) 
     File "/Library/Python/2.7/site-packages/requests/adapters.py", line 213, in send 
     raise SSLError(e) 
    requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol 
    [Finished in 20.4s with exit code 1] 

我使用的请求和OpenSSL和2.7.3的Python的最新版本。我在Mac Mountain Lion 10.8.2和Windows 7上测试了它。

我将其用于搜索,看到其他人有类似的问题。我在库请求和urllib3上发现了相关的pull请求,也看到了有关这是http连接动词的不好实现的信息。我发现使用定制适配器(我不记得准确,但我认为这是正确的术语)使用自定义SSL协议的修复。试了一下,都没有帮助。

所以,我在寻找更多信息。你有什么想法是怎么回事,我可以修复它等等...

欢迎所有帮助,谢谢大家!

PS:我尝试了几个代理,我相信他们不是问题。

+0

甚至没有一个线索猴子补丁小费? :) –

+0

这可能有所帮助:http://stackoverflow.com/questions/13463206/how-to-get-https-content-using-python-requests-through-tor-and-privoxy?rq=1 –

+0

它看起来像urllib3即将支持:https://github.com/shazow/urllib3/pull/139。 –

回答

14

我有同样的问题,但试图使用oauth2client(谷歌库使用oauth2对他们的API)。 faffing(“试验”)的一整天后,我发现我有环境变量设置如下:

https_proxy=https://your-proxy:port 

改变这

https_proxy=http://your-proxy:port 

完全解决了这个问题对我来说。推测这意味着从客户端到代理的初始握手现在是未加密的,但之后https必须直接流动。我不相信我的公司代理被配置为反正https。

但请注意,我的浏览器在以前的设置中表现都很好。也许他们默默地试图通过http建立代理连接后,未能使用https。

使用Google搜索可以同时将https_proxy设置为http或https地址。我想这取决于如何配置代理。

浏览器/操作系统配置弹出窗口中的“用于所有协议”按钮可以很容易地意外使用我的设置。

但是我不确定这是否是您的问题。您的代码表明您已经为http和https使用完全相同的代理设置。

顺便说一下,这一切都在Ubuntu 12.04.1上。这里

+0

请停止发布和删除。你应该能够看到你删除的帖子,所以编辑它,然后取消删除。 –

+0

这对我有效。我不知道这是否可以扩展到任何类型的https协议代理,但如果是这样的话,请求库应该能够自己检测和纠正这个问题 –