2016-11-22 84 views
1

使用Python requests这样Python的请求,让我 “坏握手” 错误

import requests; 
requests.get('https://internal.site.no') 

给我一个错误manyhavehad;

SSLError: ("bad handshake: Error([('SSL routines', 'SSL23_GET_SERVER_HELLO', 'sslv3 alert handshake failure')],)",) 

但是,他们建议的遗漏包中没有一个适用。即使设置verify=False也给我同样的错误。 Curl试图访问同一个网站时没有错误。

版本:

  • 高山3.4
  • 请求2.12.1(它在2.11.1)
  • OpenSSL的1.0.2j 2016年9月26日

回答

5

最可能的误差requests和服务器无法协商使用的密码。

检查卷曲用途;

curl --verbose https://internal.site.no/ 

它会给你大量的输出,但你正在寻找一个有点像SSL connection using TLSv1.2/ECDHE-RSA-AES128-GCM-SHA256

查看来自2.11.1 to 2.12.0请求的差异,显示urllib3的新版本(版本1.19)。也许是在这里咬你的removal of 3des

如果您检查curl --verbose ...输出使用的密码与this有用的密码名称映射列表。你可以尝试添加名称openssl名到什么requests接受,例如(你可以做到这一点在你的应用程序/脚本的开头):

import requests 
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS += ':ADH-AES128-SHA256' 

如果卷曲显示你,这是一个使用TLS_DH_anon_WITH_AES_128_CBC_SHA256(作为例)。

另一个方便的技巧是使用nmap的脚本ssl-enum-ciphers,像这样:

nmap --script ssl-enum-ciphers -p 443 internal.site.no 

得到一个什么样找到所支持的密码(注意,脚本可能是嘈杂的)一个列表...

1

我也有同样的问题。检查您使用的是哪个版本的请求。

import requests 
print requests.__version__ 

您应该尝试降级到版本2.11.1。我这样做了,它解决了我的问题。要做到这一点,在终端发出以下命令:

pip uninstall requests 
pip install requests==2.11.1 

希望这会有所帮助。

+0

然后它可能是从urllib3中删除3des,它也咬你。我的答案差异的链接。我认为这是一个更好的解决方案,可以修复urllib3中的'DEFAULT_CIPHERS',而不是卡在旧版本中。问题出在我们正在和这个人聊天的'https'服务器上。这是3des出局的原因.. :) – xeor

+0

这应该是答案。 – Bhargav