2013-01-18 7 views
8

Es ist Tage her, seit ich begann, nach einer Lösung dafür zu suchen.Python Anfragen SSL-Problem

Ich habe versucht, Anfragen zu verwenden, um eine HTTPS-Anfrage über einen Proxy ohne Glück zu machen.

Altough dies in einem größeren Projekt von mir aufgenommen, es läuft alles auf das getan:

import requests 

    prox = 'xxx.xxx.xxx.xxx:xxx' # fill in valid proxy 

    r = requests.get('https://ipdb.at', proxies={'http': prox, 
               'https': prox}) 

Ich habe versucht, die kward überprüfen = False, aber ich bekomme immer wieder den gleichen Fehler oder eine Variation davon:

Traceback (most recent call last): 
     File "/Users/mg/Desktop/proxy_service.py", line 21, in <module> 
     verify=False) 
     File "/Library/Python/2.7/site-packages/requests/api.py", line 55, in get 
     return request('get', url, **kwargs) 
     File "/Library/Python/2.7/site-packages/requests/api.py", line 44, in request 
     return session.request(method=method, url=url, **kwargs) 
     File "/Library/Python/2.7/site-packages/requests/sessions.py", line 279, in request 
     resp = self.send(prep, stream=stream, timeout=timeout, verify=verify, cert=cert, proxies=proxies) 
     File "/Library/Python/2.7/site-packages/requests/sessions.py", line 374, in send 
     r = adapter.send(request, **kwargs) 
     File "/Library/Python/2.7/site-packages/requests/adapters.py", line 213, in send 
     raise SSLError(e) 
    requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol 
    [Finished in 20.4s with exit code 1] 

Ich benutze die neuesten Versionen von Anfragen und openssl und 2.7.3 für Python. Ich habe es auf Mac Mountain Lion 10.8.2 und auch auf Windows 7 getestet.

Ich googled dies aus, sah andere ähnliche Probleme haben. Ich habe verwandte Pull-Requests für die Anfragen der Bibliotheken und urllib3 gefunden, außerdem habe ich gesehen, dass Informationen darüber eine schlechte Implementierung des Verbs http connect sind. Ich habe eine Lösung gefunden, um einen benutzerdefinierten Adapter zu verwenden (ich erinnere mich nicht genau, aber ich denke, es ist der richtige Ausdruck), ein benutzerdefiniertes SSL-Protokoll zu verwenden. Versuchte sie alle, niemand half.

Also, ich bin auf der Suche nach weiteren Informationen. Haben Sie irgendeine Idee, was los ist, kann ich es beheben, etc, etc ...

Alle Hilfe ist willkommen und danke Ihnen allen!

PS: Ich habe mehrere Proxies versucht, und ich bin sicher, dass sie nicht das Problem sind.

+0

Nicht einmal eine Ahnung? :) –

+0

Dies kann helfen: http://stackoverflow.com/questions/13463206/how-to-get-https-content-using-python-requests-through-tor-and-privoxy?rq=1 –

+0

Es sieht aus wie urlib3 steht kurz vor der Unterstützung: https://github.com/shazow/urllib3/pull/139. –

Antwort

14

Ich hatte das gleiche Problem, aber bei der Verwendung von oauth2client (Google-Bibliothek für die Verwendung von oauth2 gegen ihre APIs). Nach einem Tag voller ("Experimente") faffing, entdeckte ich, dass ich die env Variable hatte wie folgt festgelegt:

https_proxy=https://your-proxy:port 

Dies zu ändern ist zu

https_proxy=http://your-proxy:port 

vollständig das Problem für mich fixiert. Vermutlich bedeutet dies, dass der anfängliche Handshake vom Client zum Proxy jetzt unverschlüsselt ist, aber danach muss das https direkt fließen. Ich glaube nicht, dass mein Firmen-Proxy so konfiguriert wurde, dass er https trotzdem anruft.

Beachten Sie jedoch, dass sich alle meine Browser mit der vorherigen Einstellung gut verhielten. Vielleicht versuchten sie stillschweigend, die Proxy-Verbindung über HTTP herzustellen, nachdem sie https nicht benutzt hatten.

Googling zeigt Beispiele für die Einstellung von https_proxy für HTTP- und HTTPS-Adressen gleichermaßen. Ich denke, es hängt davon ab, wie der Proxy konfiguriert ist.

Die Schaltfläche "Für alle Protokolle verwenden" in den Popup-Fenstern der Browser/OS-Konfiguration erleichtert die versehentliche Verwendung der Einstellung, die ich hatte.

Allerdings bin ich mir nicht sicher, ob das dein Problem ist. Ihr Code schlägt vor, dass Sie für HTTP und HTTPS genau die gleichen Proxyeinstellungen verwenden.

Übrigens, das war alles auf Ubuntu 12.04.1.

+0

Bitte beenden Sie das Posten und Löschen. Sie sollten in der Lage sein, Ihren gelöschten Post zu sehen, also bearbeiten Sie ihn und dann wiederherstellen. –

+0

Das hat für mich funktioniert. Ich weiß nicht, ob das für jede Art von Proxy für https-Protokoll da draußen erweiterbar ist, aber wenn dies der Fall ist, sollte Requests-Bibliothek in der Lage sein, dieses Problem selbst zu erkennen und zu beheben –