web-dev-qa-db-fra.com

Comment désactiver la vérification du certificat de sécurité dans les demandes Python

J'utilise

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

mais je reçois un request.exceptions.SSLError. Le site Web a un certificat arrivé à expiration, mais je n'envoie pas de données sensibles. Par conséquent, cela ne m'importe pas. J'imagine qu'il y a un argument comme 'verifiy = False' que je pourrais utiliser, mais je n'arrive pas à le trouver.

167
Paul Draper

De la documentation :

Les demandes peuvent également ignorer la vérification du certificat SSL si vous définissez verify sur False.

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

Si vous utilisez un module tiers et que vous souhaitez désactiver les vérifications, voici un gestionnaire de contexte qui modifie les correctifs requests et le modifie de sorte que verify=False soit la valeur par défaut et supprime l'avertissement.

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

Voici comment vous l'utilisez:

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')

Notez que ce code ferme tous les adaptateurs ouverts ayant traité une demande corrigée une fois que vous avez quitté le gestionnaire de contexte. Cela est dû au fait que les demandes maintiennent un pool de connexions par session et que la validation des certificats ne se produit qu'une fois par connexion, ce qui entraîne des événements inattendus comme celui-ci:

>>> 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

Utilisez requests.packages.urllib3.disable_warnings ().

import requests

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

Pour ajouter à réponse de Blender , vous pouvez désactiver SSL pour toutes les demandes en utilisant Session.verify = False

import requests

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

Notez que urllib3, (que Requests utilise), déconseille fortement en faisant des demandes HTTPS non vérifiées et déclenchera un InsecureRequestWarning.

21
Stevoisiak

Si vous souhaitez envoyer une demande de post exactement avec l'option verify = False, le moyen le plus rapide consiste à utiliser ce code:

import requests

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