464 Stimmen

Wie deaktiviere ich die Sicherheitszertifikatsprüfung in Python-Anfragen

Ich benutze

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

aber ich bekomme eine request.exceptions.SSLError. Die Webseite hat ein abgelaufenes Zertifikat, aber ich sende keine sensiblen Daten, also ist es für mich nicht wichtig. Ich könnte mir vorstellen, dass es ein Argument wie 'verify=False' gibt, das ich verwenden könnte, aber ich kann es anscheinend nicht finden.

812voto

Blender Punkte 273072

Von der Dokumentation:

requests kann auch die Überprüfung des SSL-Zertifikats ignorieren, wenn Sie verify auf False setzen.

>>> requests.get('https://kennethreitz.com', verify=False)

Wenn Sie ein Drittanbietermodul verwenden und die Überprüfungen deaktivieren möchten, gibt es hier einen Kontext-Manager, der requests umbiegt und ändert, sodass verify=False der Standard ist und die Warnung unterdrückt.

import warnings
import contextlib

import requests
from urllib3.exceptions import InsecureRequestWarning

old_merge_environment_settings = requests.Session.merge_environment_settings

@contextlib.contextmanager
def no_ssl_verification():
    opened_adapters = set()

    def merge_environment_settings(self, url, proxies, stream, verify, cert):
        # Die Überprüfung erfolgt nur einmal pro Verbindung, daher müssen wir
        # alle geöffneten Adapter schließen, sobald wir fertig sind. Andernfalls bleiben
        # die Auswirkungen von verify=False über das Ende dieses Kontext-Managers hinaus bestehen.
        opened_adapters.add(self.get_adapter(url))

        settings = old_merge_environment_settings(self, url, proxies, stream, verify, cert)
        settings['verify'] = False

        return settings

    requests.Session.merge_environment_settings = merge_environment_settings

    try:
        with warnings.catch_warnings():
            warnings.simplefilter('ignore', InsecureRequestWarning)
            yield
    finally:
        requests.Session.merge_environment_settings = old_merge_environment_settings

        for adapter in opened_adapters:
            try:
                adapter.close()
            except:
                pass

So verwenden Sie es:

with no_ssl_verification():
    requests.get('https://wrong.host.badssl.example/')
    print('Es funktioniert')

    requests.get('https://wrong.host.badssl.example/', verify=True)
    print('Auch wenn Sie versuchen, es zu erzwingen')

requests.get('https://wrong.host.badssl.example/', verify=False)
print('Es setzt zurück')

session = requests.Session()
session.verify = True

with no_ssl_verification():
    session.get('https://wrong.host.badssl.example/', verify=True)
    print('Funktioniert auch hier')

try:
    requests.get('https://wrong.host.badssl.example/')
except requests.exceptions.SSLError:
    print('Es bricht ab')

try:
    session.get('https://wrong.host.badssl.example/')
except requests.exceptions.SSLError:
    print('Es bricht auch hier ab')

Beachten Sie, dass dieser Code alle offenen Adapter schließt, die eine gepatchte Anforderung verarbeitet haben, sobald Sie den Kontext-Manager verlassen. Dies liegt daran, dass requests einen pro-Sitzung Verbindungspool aufrechterhält und die Zertifikatsvalidierung nur einmal pro Verbindung erfolgt, sodass unerwartete Dinge wie dies passieren werden:

>>> import requests
>>> session = requests.Session()
>>> session.get('https://wrong.host.badssl.example/', verify=False)
/usr/local/lib/python3.7/site-packages/urllib3/connectionpool.py:857: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
  InsecureRequestWarning)

>>> session.get('https://wrong.host.badssl.example/', verify=True)
/usr/local/lib/python3.7/site-packages/urllib3/connectionpool.py:857: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
  InsecureRequestWarning)

182voto

efrenfuentes Punkte 2036

Verwenden Sie requests.packages.urllib3.disable_warnings() und verify=False auf requests Methoden.

import requests
from urllib3.exceptions import InsecureRequestWarning

# Unterdrücken Sie nur die einzelne Warnung von urllib3, die benötigt wird.
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)

# Setzen Sie `verify=False` auf `requests.post`.
requests.post(url='https://example.com', data={'bar':'baz'}, verify=False)

71voto

Stevoisiak Punkte 19768

Um zu Blenders Antwort hinzuzufügen, können Sie die SSL-Zertifikatsvalidierung für alle Anfragen deaktivieren, indem Sie Session.verify = False verwenden

import requests

session = requests.Session()
session.verify = False
session.post(url='https://example.com', data={'bar':'baz'})

Beachten Sie, dass urllib3 (das Requests verwendet), dringend davon abrät, unüberprüfte HTTPS-Anfragen zu stellen, und einen InsecureRequestWarning auslösen wird.

39voto

Stan Gabenov Punkte 947

Kann auch mit einer Umgebungsvariable gemacht werden:

export CURL_CA_BUNDLE=""

12voto

Ruslan Khyurri Punkte 147

Wenn Sie einen Post-Request mit der Option verify=False senden möchten, ist der schnellste Weg, diesen Code zu verwenden:

import requests

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X