2016-11-22 3 views
1

Python Mit requests wie diesePython-Anfragen gibt mir "schlechte Handshake" Fehler

import requests; 
requests.get('https://internal.site.no') 

ist mir ein Fehler manyhavehad;

SSLError: ("bad handshake: Error([('SSL routines', 'SSL23_GET_SERVER_HELLO', 'sslv3 alert handshake failure')],)",) 

jedoch nichts von dem fehlenden Paket schlägt sie vor. Selbst Einstellung verify=False gibt mir den gleichen Fehler. Curl gibt mir keinen Fehler beim Zugriff auf die gleiche Website.

Versionen:

  • Alpine 3.4
  • Anfragen 2.12.1 (es funktioniert in 2.11.1)
  • OpenSSL 1.0.2j 26 sep 2016

Antwort

5

Der wahrscheinlichste Fehler ist dass requests und der Server nicht in der Lage sind, eine Chiffre auszuhandeln, um zu verwenden.

Überprüfen Sie, welche Locke verwendet;

curl --verbose https://internal.site.no/ 

Es wird Ihnen eine Menge ausgegeben, aber die, die Sie suchen, ist so etwas wie SSL connection using TLSv1.2/ECDHE-RSA-AES128-GCM-SHA256.

Blick auf den Unterschied von 2.11.1 to 2.12.0 Anfragen, zeigt eine neue Version von Urllib3 (zu Version 1.19). Vielleicht ist es die removal of 3des, die Sie hier beißt?

Wenn Sie Ihre curl --verbose ... Ausgabe Chiffre gegen this nützliche Liste der Chiffre Namen Zuordnung überprüfen. Sie können versuchen, den openssl Name des Namens auf das Hinzufügen was requests akzeptieren, Beispiel (Sie dies am Anfang Ihrer App/script tun können):

import requests 
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS += ':ADH-AES128-SHA256' 

wenn curl Sie zeigt, dass es mit TLS_DH_anon_WITH_AES_128_CBC_SHA256 ist (als Beispiel).

Ein weiterer praktischer Tipp ist das nmap Skript ssl-enum-ciphers, wie diese verwenden:

nmap --script ssl-enum-ciphers -p 443 internal.site.no 

eine Liste zu bekommen, was sie findet als unterstützte Chiffren (beachten Sie, Skript laut sein könnte) ...

1

Ich hatte auch das gleiche Problem. Überprüfen Sie, welche Version der Anfragen Sie verwenden.

import requests 
print requests.__version__ 

sollten Sie versuchen, 2.11.1 auf Version Herabstufung. Ich habe das gemacht und es hat mein Problem behoben. Geben Sie dazu im Terminal die folgenden Befehle ein:

pip uninstall requests 
pip install requests==2.11.1 

Hoffen Sie, dass dies hilft.

+0

Dann ist es wahrscheinlich die Entfernung von 3des von urllib3, die Sie auch beißen würde. Der Link in meiner Antwort für diff. Ich denke, es ist eine bessere Lösung, die 'DEFAULT_CIPHERS' in urllib3 zu monkeyern als auf einer alten Version zu bleiben. Das Problem liegt im https-Server, mit dem wir reden.Es ist ein Grund, warum 3des out ist .. :) – xeor

+0

Dies sollte die Antwort sein. – Bhargav