Python请求给了我“错误的握手”

2024-04-29 02:09:01 发布

您现在位置:Python中文网/ 问答频道 /正文

像这样使用Pythonrequests

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日

Tags: nohttpsimportsslget错误siteerror
2条回答

最可能的错误是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'

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

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

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

要获取它找到的受支持密码的列表(注意,脚本可能有噪音)。。。

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

import requests
print requests.__version__

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

pip uninstall requests
pip install requests==2.11.1 

希望这有帮助。

相关问题 更多 >