Jedes Mal, wenn ich versuche zu tun:
requests.get('https://url')
Ich habe diese Nachricht erhalten:
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
Ich habe alles versucht:
aber nichts ändert sich.
Ich benutze Python 2.7.6, kann das nicht ändern.
Ich löse das Problem am Ende. Ich habe mein Ubuntu von 14.04 auf 14.10 aktualisiert und das Problem wurde gelöst
aber in der älteren Version von Ubuntu und Python installiere ich diese lib und es scheint alle meine Probleme zu beheben
Sudo apt-get install python-dev libssl-dev libffi-dev
Sudo pip2.7 install -U pyopenssl==0.13.1 pyasn1 ndg-httpsclient
wenn Sie pip2.7 nicht installiert haben, können Sie stattdessen pip verwenden
Unter OSX unter Verwendung von Python 2.7.10/request 2.9.1 musste ich lediglich requests
mit seiner Sicherheitseinrichtung installieren:
pip install requests[security]
Dies installiert pyOpenSSL
, ndg-httpsclient
und pyasn1
. https://github.com/kennethreitz/requests/blob/master/setup.py#L70
Wenn Sie Ihre Python-Version nicht auf 2.7.9 aktualisieren können, fordern Sie ein Downgrade-Paket auf 2.5.3 an. Das hat bei mir funktioniert.
Sudo pip install requests==2.5.3
Bearbeiten
Sie können auch Anforderungen mit Sicherheitserweiterung installieren
pip install requests[security]
nachdem Sie alle oben genannten Lösungen ausprobiert hatten und das Kaninchenloch durchgegangen waren, versuchte der Fall, den Fall schließlich zu knacken, einfach pyopenssl aus dem Paket urllib3 zu importieren:
from urllib3.contrib import pyopenssl
was mich direkt zum Fehler geführt hat (das cryptography
-Paket fehlt)
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()
Ich verwende Python 2.7.6 kann es nicht ändern.
Sorry für dich dann. Der Server, den Sie erreichen möchten, benötigt (SNI) - Servernamenanzeige und verursacht einen Handshake-Fehler, wenn der Client diese SNI-Erweiterung nicht verwendet. Die Unterstützung für SNI wurde nur mit Python 2.7.9 hinzugefügt, so dass es aussieht Du hast kein Glück.
Python ausführen 2.7.13. Ich habe hier die empfohlenen Lösungen ausprobiert, die schließlich Folgendes installierten:
pip install requests[security]
(installiert als n1crypto-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)keine hilfe, dann versucht
pip install -U requests
(installiertes certifi-2018.10.15 chardet-3.0.4-Anforderungen-2.20.1 urllib3-1.24.1)keine Hilfe. Schließlich versucht
pip install -U httplib2
(httplib2-0.12.0)was das Problem gelöst hat. Zuvor habe ich httplib2 == 0.9.2 ausgeführt
Diese Fehlermeldung wurde immer angezeigt, wenn ich eine Verbindung zu einer alten Website mit veraltetem HTTPS aufbaute.
Am Ende musste ich das Protokoll UND die Chiffren manuell mit einem Adapter einstellen, damit die Anfrage funktioniert.
Was für mich funktioniert hat
erstellen Sie dann in Anfragen einen Adapter mit dem, was Sie oben recherchiert haben
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)
jetzt montiere ich den Adapter an das Requests-Objekt
url = "https://yourwebsite.gov.whocares"
session = requests.session()
session.mount(url, OldInsecureWebsiteAdapter())
result = session.get(url)
#no more ssl3 handshake error...