Requests: SSLV3_ALERT_HANDSHAKE_FAILURE in Python 3.5, funktioniert in Python 2.7

Erstellt am 30. Juli 2018  ·  3Kommentare  ·  Quelle: psf/requests

Ich führe folgenden Code aus:

import requests
import ssl
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.poolmanager import PoolManager

class SSLAdapter(HTTPAdapter):
    '''An HTTPS Transport Adapter that uses an arbitrary SSL version.'''
    def __init__(self, ssl_version=None, **kwargs):
        self.ssl_version = ssl_version

        super(SSLAdapter, self).__init__(**kwargs)

    def init_poolmanager(self, connections, maxsize, block=False):
        self.poolmanager = PoolManager(num_pools=connections,
                                       maxsize=maxsize,
                                       block=block,
                                       ssl_version=self.ssl_version)

s = requests.Session()
s.mount('https://', SSLAdapter(ssl.PROTOCOL_TLSv1_2))

print(ssl.OPENSSL_VERSION)

r = s.get('https://bibliothek.weltenbau.net/api/profile/265854176393691138')
print(r.status_code)

Mit Python 3.5.3 erhalte ich die folgenden Fehler:

OpenSSL 1.1.0f  25 May 2017
Traceback (most recent call last):
  File "/opt/weltenbau-bot/.venv/lib/python3.5/site-packages/urllib3/connectionpool.py", line 600, in urlopen
    chunked=chunked)
  File "/opt/weltenbau-bot/.venv/lib/python3.5/site-packages/urllib3/connectionpool.py", line 343, in _make_request
    self._validate_conn(conn)
  File "/opt/weltenbau-bot/.venv/lib/python3.5/site-packages/urllib3/connectionpool.py", line 849, in _validate_conn
    conn.connect()
  File "/opt/weltenbau-bot/.venv/lib/python3.5/site-packages/urllib3/connection.py", line 356, in connect
    ssl_context=context)
  File "/opt/weltenbau-bot/.venv/lib/python3.5/site-packages/urllib3/util/ssl_.py", line 359, in ssl_wrap_socket
    return context.wrap_socket(sock, server_hostname=server_hostname)
  File "/usr/lib/python3.5/ssl.py", line 385, in wrap_socket
    _context=self)
  File "/usr/lib/python3.5/ssl.py", line 760, in __init__
    self.do_handshake()
  File "/usr/lib/python3.5/ssl.py", line 996, in do_handshake
    self._sslobj.do_handshake()
  File "/usr/lib/python3.5/ssl.py", line 641, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:720)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/opt/weltenbau-bot/.venv/lib/python3.5/site-packages/requests/adapters.py", line 445, in send
    timeout=timeout
  File "/opt/weltenbau-bot/.venv/lib/python3.5/site-packages/urllib3/connectionpool.py", line 638, in urlopen
    _stacktrace=sys.exc_info()[2])
  File "/opt/weltenbau-bot/.venv/lib/python3.5/site-packages/urllib3/util/retry.py", line 398, in increment
    raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='bibliothek.weltenbau.net', port=443): Max retries exceeded with url: /api/profile/265854176393691138 (Caused by SSLError(SSLError(1, '[SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:720)'),))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "test.py", line 24, in <module>
    r = s.get('https://bibliothek.weltenbau.net/api/profile/265854176393691138')
  File "/opt/weltenbau-bot/.venv/lib/python3.5/site-packages/requests/sessions.py", line 525, in get
    return self.request('GET', url, **kwargs)
  File "/opt/weltenbau-bot/.venv/lib/python3.5/site-packages/requests/sessions.py", line 512, in request
    resp = self.send(prep, **send_kwargs)
  File "/opt/weltenbau-bot/.venv/lib/python3.5/site-packages/requests/sessions.py", line 622, in send
    r = adapter.send(request, **kwargs)
  File "/opt/weltenbau-bot/.venv/lib/python3.5/site-packages/requests/adapters.py", line 511, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host='bibliothek.weltenbau.net', port=443): Max retries exceeded with url: /api/profile/265854176393691138 (Caused by SSLError(SSLError(1, '[SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:720)'),))

Mit Python 2.7.13 funktioniert alles wie erwartet:

OpenSSL 1.1.0f  25 May 2017
200

System Information

Python 3.5.3

Anfragen.Hilfe

{
  "chardet": {
    "version": "3.0.4"
  },
  "cryptography": {
    "version": ""
  },
  "idna": {
    "version": "2.7"
  },
  "implementation": {
    "name": "CPython",
    "version": "3.5.3"
  },
  "platform": {
    "release": "4.9.0-6-amd64",
    "system": "Linux"
  },
  "pyOpenSSL": {
    "openssl_version": "",
    "version": null
  },
  "requests": {
    "version": "2.19.1"
  },
  "system_ssl": {
    "version": "1010006f"
  },
  "urllib3": {
    "version": "1.23"
  },
  "using_pyopenssl": false
}

pip einfrieren

certifi==2018.4.16
chardet==3.0.4
idna==2.7
requests==2.19.1
urllib3==1.23

Python 2.7.13:

Anfragen.Hilfe

{
  "chardet": {
    "version": "3.0.4"
  },
  "cryptography": {
    "version": ""
  },
  "idna": {
    "version": "2.7"
  },
  "implementation": {
    "name": "CPython",
    "version": "2.7.13"
  },
  "platform": {
    "release": "4.9.0-6-amd64",
    "system": "Linux"
  },
  "pyOpenSSL": {
    "openssl_version": "",
    "version": null
  },
  "requests": {
    "version": "2.19.1"
  },
  "system_ssl": {
    "version": "1010006f"
  },
  "urllib3": {
    "version": "1.23"
  },
  "using_pyopenssl": false
}

pip einfrieren

certifi==2018.4.16
chardet==3.0.4
idna==2.7
requests==2.19.1
urllib3==1.23

Mögliche Lösung

Die Installation von pyOpenSSL im Python3-Venv scheint dieses Problem zu beheben.

Hilfreichster Kommentar

hey hast du eine lösung gefunden?

Alle 3 Kommentare

Hallo @ghtyrant ,

Es sieht so aus, als ob Ihr SSL-Setup zwischen jeder Python-Installation etwas abweicht. Der 3.5-Interpreter kann kein akzeptables Protokoll mit dem Server aushandeln. Die Tatsache, dass die Installation von PyOpenSSL dies behebt, deutet darauf hin, dass mit Ihrem 3.5 SSL-Setup etwas nicht stimmt.

Leider konnte ich dies auch zwischen Installationen von 2.7.13 und 3.5.3 lokal nicht reproduzieren. Ich glaube, es gab ursprünglich einige Probleme mit OpenSSL 1.1 und Python, die aufgrund von API/Struct-Änderungen nicht gut zusammengebaut wurden.

Der einzige Rat, den ich im Moment anbieten kann, ist, entweder 3.5.3 auf Ihrem System OpenSSL neu zu installieren oder auf 3.5.6 zu aktualisieren. Ich bin mir nicht sicher, ob ich einen klaren Link zu einem Fehler in Requests und dem beobachteten Verhalten sehe. Ich werde dies vorerst schließen, aber wenn Sie weitere Informationen finden, können Sie sie gerne wieder öffnen. Danke!

Bin darauf gestoßen, als ich das gleiche Problem bei der Installation von OpenSSL 1.1.1b von package.sury.org auf Debian 9 hatte. Dies war der einfachste Weg, um die neueste Version von nginx und TLS 1.3 zu erhalten.

Anscheinend funktioniert es jedoch nicht sehr gut mit der Standard-Python-Installation (3.5.3) und verursachte diesen Fehler in der Django-App. Die Installation von pyOpenSSL behebt das Problem.

Wir müssen wohl auf Debian 10 warten, damit TLS 1.3 und Python richtig zusammenarbeiten ;-)

hey hast du eine lösung gefunden?

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen