Requests: SSLV3_ALERT_HANDSHAKE_FAILURE en Python 3.5, fonctionne en Python 2.7

Créé le 30 juil. 2018  ·  3Commentaires  ·  Source: psf/requests

J'exécute le code suivant :

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)

En utilisant Python 3.5.3, j'obtiens les erreurs suivantes :

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)'),))

En utilisant Python 2.7.13, tout fonctionne comme prévu :

OpenSSL 1.1.0f  25 May 2017
200

Informations système

Python 3.5.3

demandes.d'aide

{
  "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
}

gel de pépin

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

Python 2.7.13 :

demandes.d'aide

{
  "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
}

gel de pépin

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

Solution possible

L'installation de pyOpenSSL dans Python3 venv semble résoudre ce problème.

Commentaire le plus utile

salut tu as trouvé une solution ?

Tous les 3 commentaires

Salut @ghtyrant ,

Il semble qu'il y ait une certaine variation dans votre configuration SSL entre chaque installation python. L'interpréteur 3.5 est incapable de négocier un protocole acceptable avec le serveur. Le fait que l'installation de PyOpenSSL résolve ce problème suggère qu'il y a un problème avec votre configuration SSL 3.5.

Je n'ai malheureusement pas non plus pu reproduire cela localement entre les installations de 2.7.13 et 3.5.3. Je pense qu'il y avait à l'origine des problèmes avec OpenSSL 1.1 et Python qui ne se construisaient pas bien ensemble en raison des modifications de l'API/de la structure.

Le seul conseil que je peux offrir pour le moment est de regarder soit la réinstallation de la 3.5.3 sur votre système OpenSSL, soit la mise à niveau vers la 3.5.6. Je ne suis pas sûr de voir un lien clair vers un défaut dans les demandes et le comportement observé. Je vais fermer ça pour le moment mais si vous trouvez plus d'informations, n'hésitez pas à rouvrir. Merci!

Je suis tombé sur cela lorsque j'ai rencontré le même problème lors de l'installation d'OpenSSL 1.1.1b à partir de packages.sury.org sur Debian 9. C'était le moyen le plus simple d'obtenir la dernière version de nginx et TLS 1.3.

Cependant, apparemment, il ne fonctionne pas très bien avec l'installation Python par défaut (3.5.3) et provoquait cette erreur dans l'application Django. L'installation de pyOpenSSL résout le problème.

Je suppose que nous devrons attendre que Debian 10 pour que TLS 1.3 et Python fonctionnent correctement ensemble ;-)

salut tu as trouvé une solution ?

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

brainwane picture brainwane  ·  3Commentaires

remram44 picture remram44  ·  4Commentaires

thadeusb picture thadeusb  ·  3Commentaires

everping picture everping  ·  4Commentaires

ReimarBauer picture ReimarBauer  ·  4Commentaires