Como desabilito a verificação do certificado de segurança em solicitações do Python?




request post api python (4)

Use requests.packages.urllib3.disable_warnings ().

import requests

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

estou usando

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

mas recebo um request.exceptions.SSLError. O site tem um certificado expirado, mas não estou enviando dados confidenciais, então não me interessa. Eu imagino que há um argumento como 'verifiy = False' que eu poderia usar, mas não consigo encontrá-lo.


Se você quiser enviar exatamente uma solicitação de postagem com a opção verify = False, o caminho mais rápido é usar este código:

import requests

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

Da documentação :

As solicitações também podem ignorar a verificação do certificado SSL, se você definir verify como False.

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

Se você estiver usando um módulo de terceiros e quiser desabilitar as verificações, aqui está um gerenciador de contexto que atualiza as requests e altera-as para que verify=False seja o padrão e suprima o aviso.

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

Veja como você o usa:

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

Observe que esse código fecha todos os adaptadores abertos que manipularam uma solicitação corrigida depois que você sai do gerenciador de contexto. Isso ocorre porque as solicitações mantêm um conjunto de conexões por sessão e a validação do certificado acontece apenas uma vez por conexão, de modo que coisas inesperadas como essa ocorrerão:

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

Para adicionar a resposta do Blender , você pode desativar o SSL para todas as solicitações usando Session.verify = False

import requests

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

Observe que o urllib3 , (que o Requests usa), desencoraja fortemente a criação de solicitações HTTPS não verificadas e InsecureRequestWarning um InsecureRequestWarning .





python-requests