Python请求给我"坏握手"错误

xeo*_*eor 4 python ssl python-requests

使用像这样的Python 请求

import requests;
requests.get('https://internal.site.no')
Run Code Online (Sandbox Code Playgroud)

给我一个错误很多 已经 ;

SSLError: ("bad handshake: Error([('SSL routines', 'SSL23_GET_SERVER_HELLO', 'sslv3 alert handshake failure')],)",)
Run Code Online (Sandbox Code Playgroud)

但是,他们建议没有丢失的包装.即使设置也会verify=False给我带来同样的错误.Curl在尝试访问同一站点时没有错误.

版本:

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

xeo*_*eor 9

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

检查curl使用的是什么;

curl --verbose https://internal.site.no/
Run Code Online (Sandbox Code Playgroud)

它会给你很多输出,但你正在寻找的是类似的SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256.

查看从2.11.1到2.12.0请求的差异,显示了urllib3的新版本(到版本1.19).也许这是在你这里咬你的3des删除

如果你检查你的curl --verbose ...输出使用密码对这个有用的密码名称映射列表.您可以尝试将openssl名称的名称添加到requests接受的示例中(您可以在app /脚本的开头执行此操作):

import requests
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS += ':ADH-AES128-SHA256'
Run Code Online (Sandbox Code Playgroud)

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

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

nmap --script ssl-enum-ciphers -p 443 internal.site.no
Run Code Online (Sandbox Code Playgroud)

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


CPS*_*ore 5

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

import requests
print requests.__version__
Run Code Online (Sandbox Code Playgroud)

您应该尝试降级到2.11.1版本。我做到了,它解决了我的问题。为此,请在终端中发出以下命令

pip uninstall requests
pip install requests==2.11.1 
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。