Python 版本:3.5.2
操作系统:OS X 10.12
OpenSSL 版本:OpenSSL 1.1.0b 2016 年 9 月 26 日
我正在尝试请求“https://alpha.wallhaven.cc”。
import urllib.request
init_page=urllib.request.urlopen("https://alpha.wallhaven.cc")
然后得到
ssl.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:645)
和
During handling of the above exception, another exception occurred:
...
urllib.error.URLError: <urlopen error [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:645)>
以下解决方案不起作用:
import requests.packages.urllib3.util.ssl_
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS='ALL'
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
import requests
print(requests.get("https://alpha.wallhaven.cc",verify=False))
或更改/APNSWrapper/connection.py 第 131 行:
ssl_version = self.ssl_module.PROTOCOL_SSLv3,
进入
ssl_version = self.ssl_module.PROTOCOL_TLSv1,
那么问题是什么?如何解决?非常感谢!
OpenSSL Version: OpenSSL 1.1.0b 26 Sep 2016 ... sslv3 alert handshake failure (_ssl.c:645)>
我不怀疑你的系统上安装了 OpenSSL 1.1.0b,但我怀疑你的 python 是否实际使用了这个版本。通常 MacOS 安装了旧版本 0.9.8 的 OpenSSL,除非一个 compiles python to use another openssl将使用此版本,即使系统上某处安装了其他 OpenSSL 版本。要检查您的 python 使用的 OpenSSL 版本:
import ssl
print(ssl.OPENSSL_VERSION)
如果这显示 OpenSSL 1.1.0b...
我的假设是错误的,但如果这显示 0.9.8 我的论证是正确的:
握手失败
表示与证书验证无关的问题。
- 查看 SSLLabs report我可以看到服务器只支持 ECDHE 密码。
- OpenSSL 0.9.8 版不支持 ECDHE 密码
- 因此客户端和服务器之间没有共享密码,握手失败
我是一名优秀的程序员,十分优秀!