【问题标题】:Requests failing to connect to a TLS server请求无法连接到 TLS 服务器
【发布时间】:2017-10-23 19:27:28
【问题描述】:

我在追踪 requests 无法连接到特定主机的原因时遇到问题。

通过 curl 或浏览器可以正常工作:

curl https://banking4.anz.com

但是,如果我使用请求:

requests.get('https://banking4.anz.com')

我明白了:

SSLError: ("bad handshake: SysCallError(-1, 'Unexpected EOF')",)

在网络上,我只看到客户端打招呼,而服务器立即断开连接,因此似乎没有任何 ssl 或密码不兼容。 (我预计这些会出现 SSL 层错误)在这种情况下还有什么问题?

我在 python 3.6.1 上使用请求 2.14.2(带有安全附加功能)。

【问题讨论】:

  • 我会检查 requests 的版本是否支持开箱即用的 SNI。

标签: python ssl python-requests


【解决方案1】:

此服务器以多种方式损坏。

一方面,only understands DES-CBC3-SHA 被认为是不安全的,不包含在default cipher set used by requests 中。此外,它看起来只检查 ClientHello 中提供的有限数量的密码,因此如果在此密码之前有太多其他提议,则不会看到客户端提供了 DES-CBC3-SHA。

这个损坏的服务器的快速解决方法是只提供服务器支持的唯一密码:

import requests
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS = 'DES-CBC3-SHA'
requests.get('https://banking4.anz.com')

但请注意,这会将请求的默认密码列表设置为不安全的值。因此,如果您想连接到应用程序中的其他站点,则不应使用此方法。相反,请查看 this more complex solution 使用您自己的 HTTPAdapter 以及针对损坏站点的特定密码设置。

【讨论】:

    猜你喜欢
    • 2015-10-17
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 2012-09-21
    • 2020-05-14
    • 1970-01-01
    相关资源
    最近更新 更多