2013-03-16 8 views
74

ichWie deaktiviere ich die Prüfung Sicherheitszertifikat in Python fordert

bin mit
import requests 
requests.post(url='https://foo.com', data={'bar':'baz'}) 

aber ich bekomme eine request.exceptions.SSLError. Die Website hat ein abgelaufenes Zertifikat, aber ich sende keine sensiblen Daten, deshalb ist es mir egal. Ich könnte mir vorstellen, dass es ein Argument wie "verifiy = False" gibt, das ich verwenden könnte, aber ich kann es nicht finden.

Antwort

146

Von the documentation:

Anfragen können auch die SSL certficate ignorieren überprüfen, ob Sie verify auf False.

>>> requests.get('https://kennethreitz.com', verify=False) 
<Response [200]> 

Wenn Sie einen Drittanbieter-Modul verwenden und wollen die Prüfungen deaktivieren, ist hier ein Kontext-Manager, dass Affen Patches requests und ändert es so, dass verify=False der Standard ist und unterdrückt die Warnung.

import warnings 
import requests 
import contextlib 

try: 
    from functools import partialmethod 
except ImportError: 
    # Python 2 fallback: https://gist.github.com/carymrobbins/8940382 
    from functools import partial 

    class partialmethod(partial): 
     def __get__(self, instance, owner): 
      if instance is None: 
       return self 

      return partial(self.func, instance, *(self.args or()), **(self.keywords or {})) 

@contextlib.contextmanager 
def no_ssl_verification(): 
    old_request = requests.Session.request 
    requests.Session.request = partialmethod(old_request, verify=False) 

    warnings.filterwarnings('ignore', 'Unverified HTTPS request') 
    yield 
    warnings.resetwarnings() 

    requests.Session.request = old_request 

Und ein Beispiel dafür, wie man es benutzt:

with no_ssl_verification(): 
    requests.get('https://93.184.216.3/') 
    print('It works') 

try: 
    requests.get('https://93.184.216.3/') 
except requests.exceptions.SSLError: 
    print('It broke') 
+6

Danke, das funktioniert, wenn Sie einige Wünsche haben Anrufe in Ihrem eigenen Code, aber stellen Sie sich vor, dass ich das in einer dritten, teilweise Bibliothek, die Anfragen verwendet, deaktivieren möchte ... es wäre unmöglich, die 3rd-Party-Bibliothek wie diese zu reparieren. – sorin

+6

@sorin: Just affe patch 'requests' und' verify' default auf 'False'. – Blender

+2

Wie unterdrücke ich die große böse Warnmeldung, die noch gedruckt wird? – Michael

37

Verwenden requests.packages.urllib3.disable_warnings().

import requests 

requests.packages.urllib3.disable_warnings() 
requests.post(url='https://foo.com', data={'bar':'baz'}) 
+6

Ihre Antwort ist nützlich, wenn Sie Warnungen wie "Unbestätigte HTTPS-Anfrage wird gemacht" loswerden wollen. Aber '' verify = False'' muss trotzdem vorhanden sein. Tnx. – Lufa

+1

Und um zu vermeiden, alle Warnungen zu verstecken: 'von urllib3.exceptions import InsecureRequestWarning' dann 'requests.packages.urllib3.disable_warnings (category = InsecureRequestWarning)' –

3

Wenn Sie genau Anfrage Post senden möchten mit überprüfen = False Option, schnellste Weg, diesen Code zu verwenden ist:

import requests 

requests.api.request('post', url, data={'bar':'baz'}, json=None, verify=False) 
Verwandte Themen