通过urllib2的HTTPS请求在NTLM代理后面失败

时间:2014-07-22 07:54:18

标签: python https urllib2 monkeypatching

通过Python urllib2我尝试通过HTTPS获取数据而我在公司NTLM代理后面。

我跑

proxy_url = ('http://user:pw@ntlmproxy:port/')
proxy_handler = urllib2.ProxyHandler({'http': proxy_url})
opener = urllib2.build_opener(proxy_handler, urllib2.HTTPHandler)
urllib2.install_opener(opener)

f = urllib2.urlopen('https://httpbin.org/ip')
myfile = f.read()
print myfile

但是我得到了错误

urllib2.URLError: <urlopen error [Errno 8] _ssl.c:507: 
EOF occurred in violation of protocol>

如何解决此错误?

注意0:使用相同的代码,我可以检索不相关的HTTP等效http://httpbin.org/ip

注1:在普通浏览器中,我可以通过同一公司代理访问https://httpbin.org/ip(以及其他HTTPS网站)。

注2:我正在网上阅读许多类似的问题,有些人认为它可能与证书验证有关,但是urllib2做了< strong>不无论如何验证证书。

注3:有些人在类似的情况下建议 monekypatching ,但我想,没有办法monkeypatch _ssl.c

1 个答案:

答案 0 :(得分:0)

问题在于Python的标准HTTP库不完全使用Microsoft的专有NTLM身份验证协议。

我通过设置一个支持NTLM的本地代理解决了这个问题 - ntlmaps为我做了诀窍。(*) - 提供了对公司代理的身份验证并指向我的python没有身份验证凭据的本地代理的代码。

此外,我必须在上面列出的python代码中添加一个HTTPS的proxy_handler。所以我更换了两行

proxy_url = 'http://user:pw@ntlmproxy:port/' 
proxy_handler = urllib2.ProxyHandler({'http': proxy_url})

有两行

proxy_url = 'http://localproxy:localport/' 
proxy_url_https = 'https://localproxy:localport/' 
proxy_handler = urllib2.ProxyHandler({'http': proxy_url, 'https': proxy_url_https})

然后请求完美无缺。


(*)ntlmaps是一个Python程序。由于某些原因,在我的个人环境中,我需要代理是一个python程序。)