Python/Requests: requests.exceptions.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] Python/Requests:请求异常。SSLError:[SSL:SSLV3_ALERT_HANDSHAKE_FAILURE]

3
在使用MacOS X的Python中,尝试向网站发出POST请求,但是遇到了以下错误:post_response = session.post(post_url, data=post_payload, headers=post_headers)
Traceback (most recent call last):
  File "web_requests.py", line 424, in <module>
    main()
  File "web_requests.py", line 340, in main
    post_response = session.post(post_url, data=post_payload, headers=post_headers)
  File "/Library/Python/2.7/site-packages/requests/sessions.py", line 535, in post
    return self.request('POST', url, data=data, json=json, **kwargs)
  File "/Library/Python/2.7/site-packages/requests/sessions.py", line 488, in request
    resp = self.send(prep, **send_kwargs)
  File "/Library/Python/2.7/site-packages/requests/sessions.py", line 609, in send
    r = adapter.send(request, **kwargs)
  File "/Library/Python/2.7/site-packages/requests/adapters.py", line 497, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:590)

可能出现什么问题?

提前感谢,我一定会点赞/接受答案

编辑

针对Python中的POST请求


@OluwafemiSule 这并不特别涉及到我的具体问题。 - Jo Ko
@OluwafemiSule 不一样 - Dan Me
2
这个问题与这里的许多其他问题类似,但细节太少,无法实际看到问题的许多可能性。 请提供URL、Python的完整版本和使用的OpenSSL库(python -c'import ssl; print ssl.OPENSSL_VERSION')。 我猜问题是由于非常旧的OpenSSL版本0.9.8引起的,它随着MacOSX一起提供,不支持现代密码和TLS协议版本-但这只是许多可能性之一。 - Steffen Ullrich
@t.m.adam 不,我在使用POST请求时遇到了错误 session.post(post_url, data=post_payload, headers=post_headers) - Jo Ko
@JoKo:所以我的猜测是正确的,问题出在旧版openssl上。但是,你没有提供我要求的目标URL,因此仍然不清楚目标主机需要什么以及旧版OpenSSL是否真的是问题所在。你可以通过SSLLabs进行检查:如果该站点需要TLS 1.1或TLS 1.2或ECDHE密码套件,则问题在于你的旧版OpenSSL不支持它们。 - Steffen Ullrich
显示剩余8条评论
1个回答

1
根据SSLLabs评论中的附加信息,该网站仅支持TLS 1.2:
TLS 1.2 Yes   
TLS 1.1 No   
TLS 1.0 No   
SSL 3   No 

根据评论中的另一条信息,OpenSSL版本为0.9.8:
.. OpenSSL 0.9.8zg 14 July 2015
由于OpenSSL 0.9.8仅支持TLS 1.0,特别是不支持TLS 1.2,因此客户端和服务器之间没有共同的TLS协议。因此,握手失败。
解决问题的方法是将Python使用的OpenSSL版本从非常旧的版本升级到至少OpenSSL 1.0.1。有关更多信息,请参见 更新Python 2.7中的openssl,或使用Anaconda Python,它预安装了许多模块,并包括当前版本的OpenSSL。

你介意展示一下如何更新Python 2.7中的OpenSSL吗?我尝试了以下方法,但是迄今为止还没有成功。 - Jo Ko
@JoKo:这里有很多篇文章展示了如何在Python中更新OpenSSL(请参考jww的评论),所以我不会再添加另一篇文章。如果你想要简单的方法,就像我建议的那样使用Anaconda Python即可。 - Steffen Ullrich
尝试了第一个答案(使用sudo pip install --upgrade pyOpenSSL),并检查了Python版本,已更新到最新版本,但当我执行import sslprint ssl.OPENSSL_VERSION时,仍然是OpenSSL 0.9.8zg 14 July 2015 - Jo Ko
@JoKo:1. 你的原始问题已经得到了正确的回答(应该标记为解决)。2. 关于在Python中更新OpenSSL的问题是一个新问题,不应该在评论中提出。3. 跟随另一个问题遇到的任何问题都不应该在这里讨论。4. 为什么不像建议的那样安装Anaconda Python来避免麻烦呢? - Steffen Ullrich
Anaconda只是一堆模块的包吗? - Jo Ko
@JoKo:不,Anaconda是一个完整的Python环境,包含许多模块,并且还包括与所有这些模块链接的当前OpenSSL。 - Steffen Ullrich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接