python - 请求无法连接到 TLS 服务器

标签 python ssl python-requests

我在追踪为什么 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(具有安全附加功能)。

最佳答案

此服务器有多种故障。

首先,它 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 与损坏站点的特定密码设置一起使用。

关于python - 请求无法连接到 TLS 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52397357/

相关文章:

python - 用于扩展的 Gdb 7.10 Python 版本

spring - 在 JBoss Spring JSF Web 应用程序中配置 https

python - 无效架构 : No connection adapters were found for

Python 请求 PUT 不起作用,但 cURL 起作用

python - pandas MovingOLS 不支持 NA 值?

python - 检查列中的值是否是另一个数组的超集

python - 线程化/生成多个操作系统命令并在不同点获取输出的最佳方法

ssl - 垃圾。尝试抓取网站时出现 SSL 错误 "DH KEY TOO SMALL"

authentication - 创建服务器证书时出错 - 在 IBM Worklight 6.2 中基于 X509 证书的身份验证

python - 使用urllib在Python 3.5中获取网页的最终重定向