像这样使用Python requests
import requests;
requests.get('https://internal.site.no')
SSLError: ("bad handshake: Error([('SSL routines', 'SSL23_GET_SERVER_HELLO', 'sslv3 alert handshake failure')],)",)
然而,他们建议没有丢失的包。即使设置verify=False
也会给出同样的错误。
Curl在尝试访问同一站点时没有错误。
版本:
答案 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
希望这有帮助。