it-swarm.com.de

Wie deaktiviere ich die Sicherheitszertifikatsüberprüfung in Python Requests

Ich benutze

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, daher 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 anscheinend nicht finden.

167
Paul Draper

Von die Dokumentation :

Anforderungen können die Überprüfung des SSL-Zertifikats auch ignorieren, wenn Sie verify auf False setzen.

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

Wenn Sie ein Modul eines Drittanbieters verwenden und die Überprüfungen deaktivieren möchten, finden Sie hier einen Kontextmanager, mit dem Monkey requests patcht und so ändert, dass verify=False ist die Standardeinstellung und unterdrückt die Warnung.

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):
        # Verification happens only once per connection so we need to close
        # all the opened adapters once we're done. Otherwise, the effects of
        # verify=False persist beyond the end of this context manager.
        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.com/')
    print('It works')

    requests.get('https://wrong.Host.badssl.com/', verify=True)
    print('Even if you try to force it to')

requests.get('https://wrong.Host.badssl.com/', verify=False)
print('It resets back')

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

with no_ssl_verification():
    session.get('https://wrong.Host.badssl.com/', verify=True)
    print('Works even here')

try:
    requests.get('https://wrong.Host.badssl.com/')
except requests.exceptions.SSLError:
    print('It breaks')

try:
    session.get('https://wrong.Host.badssl.com/')
except requests.exceptions.SSLError:
    print('It breaks here again')

Beachten Sie, dass dieser Code alle offenen Adapter schließt, die eine gepatchte Anforderung verarbeitet haben, sobald Sie den Kontextmanager verlassen. Dies liegt daran, dass Requests einen Verbindungspool pro Sitzung verwalten und die Zertifikatüberprüfung nur einmal pro Verbindung erfolgt, sodass unerwartete Ereignisse wie das folgende auftreten:

>>> import requests
>>> session = requests.Session()
>>> session.get('https://wrong.Host.badssl.com/', 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)
<Response [200]>
>>> session.get('https://wrong.Host.badssl.com/', 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)
<Response [200]>
298
Blender

Verwenden Sie request.packages.urllib3.disable_warnings ().

import requests

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

Um zu Blenders Antwort hinzuzufügen, können Sie SSL für alle Anfragen mit Session.verify = False Deaktivieren.

import requests

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

Beachten Sie, dass urllib3 (Das von Requests verwendet wird) wird dringend davon abgeraten nicht verifizierte HTTPS-Anfragen zu stellen und ein InsecureRequestWarning auslöst.

21
Stevoisiak

Wenn Sie eine Post-Anfrage mit der Option verify = False genau senden möchten, können Sie diesen Code am schnellsten verwenden:

import requests

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