Python请求给了我"糟糕的握手"错误

时间:2016-11-22 12:03:27

标签: python ssl python-requests

像这样使用Python requests

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

给我一​​个错误many have had;

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

然而,他们建议没有丢失的包。即使设置verify=False也会给出同样的错误。 Curl在尝试访问同一站点时没有错误。

版本:

  • Alpine 3.4
  • 请求2.12.1(在2.11.1中有效)
  • OpenSSL 1.0.2j 26 sep 2016

2 个答案:

答案 0 :(得分:9)

最可能的错误是requests且服务器无法协商使用的密码。

检查curl使用的内容;

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'

如果curl显示它正在使用TLS_DH_anon_WITH_AES_128_CBC_SHA256(作为示例)。

另一个方便的提示是使用nmap脚本ssl-enum-ciphers,如下所示:

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

获取它所发现的支持密码列表(注意,脚本可能有噪音)......

答案 1 :(得分:4)

我也有同样的问题。检查您正在使用的请求版本。

import requests
print requests.__version__

您应该尝试降级到2.11.1版。我这样做了,它解决了我的问题。为此,请在终端

中发出以下命令
pip uninstall requests
pip install requests==2.11.1 

希望这有帮助。