python3 and requests: still getting 'sslv3 ale

2019-09-30 00:58发布

我一直在尝试使用来执行在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的sslpyOpenSSL分别,后者是一个更近OpenSSL 1.1.0i 14 Aug 2018是最有可能下跌的支持DES-CBC3-SHA密码。

下面是我所采取的临时解决方案:

  1. 卸载cryptography
  2. 仅注入所需的密码,就像这样:

(请注意,它不再是一个串联)

requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS = 'DES-CBC3-SHA'

我明白,这种解决方案可能是次优的,而不是适用于许多情况,但至少给我们的教训是,不同版本的OpenSSL可能在作怪从一个包到另一个。

我会很高兴地知道,如果任何一个更灵活的解决方案。

Answer 1:

服务器似乎是真正打破。 如果你只需要添加DES-CBC3-SHA到密码列表将无法正常工作,可能是因为服务器嘎嘎叫着,因为客户端提供密码的服务器不知道或者是因为太多的密码的。

如果一个人,而不是改变它,只允许这一个密码它为我工作,即

requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS = 'DES-CBC3-SHA'


文章来源: python3 and requests: still getting 'sslv3 alert handshake failure'