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.
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]>
Utilisez requests.packages.urllib3.disable_warnings ().
import requests
requests.packages.urllib3.disable_warnings()
requests.post(url='https://foo.com', data={'bar':'baz'})
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
.
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)