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é:
mais rien ne change.
J'utilise Python 2.7.6, cela ne peut pas changer.
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.
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
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]
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
)
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()
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.
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
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 -
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...