it-swarm.com.de

python fordert einen SSL-Handshake-Fehler an

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:

  • aktualisiere meine Anfragen
  • aktualisiere meine ssl 

aber nichts ändert sich.

Ich benutze Python 2.7.6, kann das nicht ändern.

32

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

34

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

45
Tobias Lorenz

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]
6
Hassan Raza

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)

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

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.

1
Steffen Ullrich

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

0
Lou K

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 

  1. gehen Sie zu einer Diagnoseseite wie dieser https://www.ssllabs.com/ssltest/analyze.html
  2. finden Sie heraus, welches Protokoll die Website verwendet (TLS1.0, TLS1.2, SSL3.0 (nur?) ....)
  3. finden Sie heraus, welche veralteten Chiffriersätze verwendet werden
  4. 3) Übersetzen Sie den Namen der Chiffre in den OpenSPS-Namen aus einer Liste wie https://www.openssl.org/docs/man1.1.0/apps/ciphers.html oder http://testssl.sh /openssl-rfc.mapping.html zur Verwendung im Code

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...
0
uosjead