我一直在尝试使用来执行在Python 3 HTTPS请求requests
和汇总几乎所有的记录在计算器上的之前的尝试知识。 我不能为我的生活似乎走出的sslv3 alert handshake failure
兔子洞。
这是我的环境:
- MACOS 10.13.6
- 蟒3.7.0(通过自制安装与OpenSSL的一起)
- OpenSSL的1.0.2p 2018年8月14日(的输出
print(ssl.OPENSSL_VERSION)
- 请求2.19.1(的输出
print(requests.__version__)
经由安装pip install requests[security]
- 即使密码2.3.1安装
这是裸骨失败的代码:
>>> import requests
>>> requests.get('https://iris.nuigalway.ie')
这是输出:
Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/urllib3-1.23-py3.7.egg/urllib3/contrib/pyopenssl.py", line 444, in wrap_socket
cnx.do_handshake()
File "/usr/local/lib/python3.7/site-packages/pyOpenSSL-18.0.0-py3.7.egg/OpenSSL/SSL.py", line 1907, in do_handshake
self._raise_ssl_error(self._ssl, result)
File "/usr/local/lib/python3.7/site-packages/pyOpenSSL-18.0.0-py3.7.egg/OpenSSL/SSL.py", line 1639, in _raise_ssl_error
_raise_current_error()
File "/usr/local/lib/python3.7/site-packages/pyOpenSSL-18.0.0-py3.7.egg/OpenSSL/_util.py", line 54, in exception_from_error_queue
raise exception_type(errors)
OpenSSL.SSL.Error: [('SSL routines', 'ssl3_read_bytes', 'sslv3 alert handshake failure')]
不用说其工作原理与卷曲,浏览器等。
curl --verbose "https://iris.nuigalway.ie"
这里的输出中的一个握手片段:
* ALPN, offering h2
* ALPN, offering http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* successfully set certificate verify locations:
* CAfile: /etc/ssl/cert.pem
CApath: none
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.0 (IN), TLS handshake, Server hello (2):
* TLSv1.0 (IN), TLS handshake, Certificate (11):
* TLSv1.0 (IN), TLS handshake, Server finished (14):
* TLSv1.0 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.0 (OUT), TLS change cipher, Client hello (1):
* TLSv1.0 (OUT), TLS handshake, Finished (20):
* TLSv1.0 (IN), TLS change cipher, Client hello (1):
* TLSv1.0 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.0 / DES-CBC3-SHA
* ALPN, server did not agree to a protocol
现在,通过卷曲使用的密码不确实似乎是默认的密码中urllib3
(貌似使用1.23 requests
)按https://github.com/urllib3/urllib3/blob/1.23/urllib3/util/ssl_.py
所以,我想利用在给出的建议将它添加https://stackoverflow.com/a/40741362是这样的:
>>> requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS += 'DES-CBC3-SHA'
甚至将其设置为ALL
。 我甚至尝试不验证证书,都无济于事。
>>> requests.get('https://iris.nuigalway.ie', verify=False)
用支票s_client
在服务器上:
$ openssl s_client -connect iris.nuigalway.ie:443
揭示了以下TLS版本和加密:
New, TLSv1/SSLv3, Cipher is RC4-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1
Cipher : RC4-SHA
哪些选项可能我可能还没有尝试过?
非常感谢
UPDATE
值ssl.OPENSSL_VERSION
OpenSSL.SSL.SSLeay_version(0)
显示使用两个不同版本的OpenSSL的ssl
和pyOpenSSL
分别,后者是一个更近OpenSSL 1.1.0i 14 Aug 2018
是最有可能下跌的支持DES-CBC3-SHA
密码。
下面是我所采取的临时解决方案:
- 卸载
cryptography
- 仅注入所需的密码,就像这样:
(请注意,它不再是一个串联)
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS = 'DES-CBC3-SHA'
我明白,这种解决方案可能是次优的,而不是适用于许多情况,但至少给我们的教训是,不同版本的OpenSSL可能在作怪从一个包到另一个。
我会很高兴地知道,如果任何一个更灵活的解决方案。