web-dev-qa-db-fra.com

python demande un échec de la poignée de main ssl

Chaque fois que j'essaie de faire:

requests.get('https://url') 

J'ai eu ce message:

import requests
>>> requests.get('https://reviews.gethuman.com/companies') 
Traceback (most recent call last): 
   File "<stdin>", line 1, in <module> 
   File "/usr/lib/python2.7/dist-packages/requests/api.py", line 55, in get 
    return request('get', url, **kwargs) 
   File "/usr/lib/python2.7/dist-packages/requests/api.py", line 44, in request 
    return session.request(method=method, url=url, **kwargs)    
   File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 455, in request 
    resp = self.send(prep, **send_kwargs) 
   File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 558, in send 
    r = adapter.send(request, **kwargs) 
   File "/usr/lib/python2.7/dist-packages/requests/adapters.py", line 385, in send 
    raise SSLError(e) requests.exceptions.SSLError: [Errno 1]
_ssl.c:510: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure

J'ai tout essayé:

  • mettre à jour mes demandes
  • mettre à jour mon SSL 

mais rien ne change.

J'utilise Python 2.7.6, cela ne peut pas changer.

32
Idan Haim Shalom

J'ai résolu le problème à la fin j'ai mis à jour mon Ubuntu du 14.04 au 14.10 et le problème a été résolu 

mais dans l'ancienne version d'ubuntu et python j'installe ces lib et il semble résoudre tous mes problèmes

Sudo apt-get install python-dev libssl-dev libffi-dev
Sudo pip2.7 install -U pyopenssl==0.13.1 pyasn1 ndg-httpsclient

si vous n'avez pas installé pip2.7, vous pouvez utiliser pip à la place.

34
Idan Haim Shalom

Sur OSX, en utilisant python 2.7.10/request 2.9.1, je devais seulement installer requests en utilisant sa configuration de sécurité:

pip install requests[security]

Ceci installe pyOpenSSL, ndg-httpsclient et pyasn1. https://github.com/kennethreitz/requests/blob/master/setup.py#L70

45
Tobias Lorenz

Si vous ne parvenez pas à mettre à niveau votre version de Python vers la version 2.7.9, vous devez rétrograder le package à la version 2.5.3. Cela a fonctionné pour moi.

Sudo pip install requests==2.5.3

Modifier

Vous pouvez également installer des requêtes avec l'extension de sécurité

pip install requests[security]
6
Hassan Raza

après avoir essayé toutes les solutions ci-dessus et descendu dans le terrier du lapin, le problème qui a finalement été résolu était simplement d’essayer d’importer pyopenssl à partir du paquet urllib3 comme suit:

from urllib3.contrib import pyopenssl

ce qui m'a conduit droit à l'erreur (manque le paquet cryptography)

2
Bobby
import requests

#Add support for all cipher suites
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS='ALL'
#Exclude use of pyopenssl (pyopenssl module may need to be installed first $pip install pyopenssl)
requests.packages.urllib3.contrib.pyopenssl.extract_from_urllib3()
2
Amr

J'utilise Python 2.7.6 ne peux pas le changer.

Désolé pour toi alors. Le serveur que vous tentez de joindre requiert (SNI) - Indication du nom du serveur et provoquera un échec de la négociation si le client n’utilise pas cette extension SNI. La prise en charge de SNI n’a été ajoutée qu’avec Python 2.7.9. vous n'avez pas de chance.

1
Steffen Ullrich

Exécuter python 2.7.13. J'ai essayé les solutions recommandées ici, qui ont fini par installer les suivantes: 

  • pip install requests[security] (installé asn1crypto-0.24.0 cffi-1.11.5 cryptography-2.4.2 idna-2.7 ipaddress-1.0.22 ndg-httpsclient-0.5.1 pyOpenSSL-18.0.0 pyasn1-0.4.4 pycparser-2.19)

pas d'aide, alors essayé

  • pip install -U requests (certifi installé-2018.10.15 chardet-3.0.4 request-2.20.1 urllib3-1.24.1)

pas d'aide. Enfin essayé

  • pip install -U httplib2 (httplib2-0.12.0)

qui a résolu le problème. Auparavant, j'utilisais httplib2 == 0.9.2

0
Lou K

J'ai continué à recevoir ce message d'erreur lors de la connexion à un ancien site Web avec HTTPS obsolète.

En fin de compte, j'ai dû définir le protocole ET les chiffrements manuellement avec un adaptateur pour que la requête fonctionne.

Ce qui a fonctionné pour moi - 

  1. accédez à un site de diagnostic tel que celui-ci https://www.ssllabs.com/ssltest/analyze.html
  2. savoir quel protocole utilise le site Web (TLS1.0, TLS1.2, SSL3.0 (seulement?) ....)
  3. savoir quelles suites de chiffrements obsolètes sont utilisées
  4. à partir de 3) traduire le nom de chiffrement en le nom openssl à partir d’une liste du type https://www.openssl.org/docs/man1.1.0/apps/ciphers.html ou http://testssl.sh /openssl-rfc.mapping.html à utiliser dans le code

puis dans les demandes créer un adaptateur avec ce que vous avez recherché ci-dessus

import requests, ssl
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.poolmanager import PoolManager
from requests.packages.urllib3.util import ssl_

class OldInsecureWebsiteAdapter(HTTPAdapter):
    def __init__(self, **kwargs):
        super(OldInsecureWebsiteAdapter, self).__init__(**kwargs)
    def init_poolmanager(self, *pool_args, **pool_kwargs):
        """
        my website uses TLS1.0 ONLY (from step 2) 
        and several obsolete ciphers (from step 3/4 I only picked one)
        """
        context = ssl_.create_urllib3_context(ssl.PROTOCOL_TLSv1, ciphers="DES-CBC3-SHA")

        """
        website does not support anything else so exclude all other protocols
        """
        context.options |= ssl.OP_NO_TLSv1_1 | ssl.OP_NO_TLSv1_3 | ssl.OP_NO_TLSv1_2 
        context.options |= ssl.OP_NO_SSLv3 | ssl.OP_NO_SSLv2

        self.poolmanager = PoolManager(*pool_args,
                                   ssl_context=context,
                                   **pool_kwargs)

maintenant je monte l'adaptateur sur l'objet de requête

    url = "https://yourwebsite.gov.whocares"
    session = requests.session()
    session.mount(url, OldInsecureWebsiteAdapter())
    result = session.get(url) 
    #no more ssl3 handshake error...
0
uosjead