2013-03-16 13 views
74

UżywamJak wyłączyć sprawdzanie certyfikatu bezpieczeństwa w Pythonie żąda

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

ale dostaję request.exceptions.SSLError. Strona ma wygasłą certyfikację, ale nie wysyłam danych wrażliwych, więc nie ma to dla mnie znaczenia. Wyobrażam sobie, że istnieje taki argument, jak "verifyiy = False", którego mógłbym użyć, ale nie mogę go znaleźć.

Odpowiedz

146

Od the documentation:

Wnioski można również ignorować weryfikacji certficate SSL jeśli ustawisz verify false.

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

Jeśli używasz modułu innej firmy i chcesz wyłączyć kontrole, oto kierownik kontekst że łaty małpa requests i zmienia go tak, że verify=False jest domyślnym i tłumi ostrzeżenie.

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 

a przykładem tego, jak z niego korzystać:

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

Dzięki, to działa, jeśli masz kilka żądań połączeń wewnątrz własnego kodu, ale wyobraź sobie, że chcę wyłączyć to w trzeciej częściowej bibliotece, która korzysta z żądań, ... niemożliwe byłoby naprawienie takiej biblioteki. – sorin

+6

@sorin: Po prostu patch małpy 'requests' i domyślnie' verify' na 'False'. – Blender

+2

Jak ukryć duży nieprzyjemny komunikat ostrzegawczy, który nadal jest drukowany? – Michael

37

Stosować requests.packages.urllib3.disable_warnings().

import requests 

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

Twoja odpowiedź jest przydatna, gdy chcesz pozbyć się ostrzeżeń, takich jak "Trwa żądanie niezweryfikowanej HTTPS". Ale '' verify = False'' musi i tak być obecne. Tnx. – Lufa

+1

Aby uniknąć ukrywania wszystkich ostrzeżeń: 'from urllib3.exceptions importuj InsecureRequestWarning' następnie' requests.packages.urllib3.disable_warnings (category = InsecureRequestWarning) ' –

3

Jeśli chcesz wysłać dokładnie pisać prośbę o sprawdzenie = opcję False, najszybszym sposobem jest użycie tego kodu:

import requests 

requests.api.request('post', url, data={'bar':'baz'}, json=None, verify=False) 
Powiązane problemy