Подтвердить что ты не робот

Как отключить проверку сертификата безопасности в запросах Python

Я использую

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

но я получаю request.exceptions.SSLError. Веб-сайт имеет истекший сертификат, но я не отправляю конфиденциальные данные, поэтому для меня это не имеет значения. Я бы предположил, что есть аргумент типа "verifiy = False", который я мог бы использовать, но я не могу найти его.

4b9b3361

Ответ 1

Из документации:

Запросы также могут игнорировать проверку сертификата SSL, если вы установили verify в Ложь.

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

Если вы используете сторонний модуль и хотите отключить проверки, здесь менеджер контекста, который обезьяна исправляет requests и изменяет его так, чтобы verify=False был значением по умолчанию и подавлял предупреждение.

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

Вот как вы это используете:

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

Обратите внимание, что этот код закрывает все открытые адаптеры, которые обработали пропатченный запрос, когда вы покидаете диспетчер контекста. Это связано с тем, что запросы поддерживают пул соединений для каждого сеанса, а проверка сертификата происходит только один раз для каждого соединения, поэтому могут произойти такие неожиданные вещи:

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

Ответ 2

Используйте requests.packages.urllib3.disable_warnings() и verify=False в методах requests.

import requests
from urllib3.exceptions import InsecureRequestWarning

# Suppress only the single warning from urllib3 needed.
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)

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

Ответ 3

Чтобы добавить ответ Blender, вы можете отключить SSL для всех запросов, используя Session.verify = False

import requests

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

Обратите внимание, что urllib3, (который использует запросы), решительно препятствует выполнению непроверенных запросов HTTPS и будет поднимать InsecureRequestWarning.

Ответ 4

Если вы хотите отправить точно пост-запрос с параметром verify = False, самым быстрым способом является использование этого кода:

import requests

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