/ / Comment désactiver la vérification du nom d'hôte dans les requêtes python - python, ssl, python-requests

Comment désactiver la vérification du nom d'hôte dans les requêtes python - python, ssl, python-requests

J'utilise des requêtes pour me connecter à une API RESTful. Le serveur que je souhaite atteindre utilise SSL avec un certificat auto-signé.

cafile = "gateway.pem"
r = requests.get(request, auth=("admin", "password"), verify=cafile)

le problème est que j'obtiens SSLError du nom d'hôtedécalage. il devrait y avoir un moyen de désactiver la vérification du nom d'hôte sans désactiver la validation de certificat, comme dans de nombreuses implémentations java, mais je ne peux pas trouver comment le faire avec des requêtes en python.

trace de la pile:

Traceback (most recent call last):
File "<pyshell#43>", line 1, in <module>
r = requests.get(request, auth=("admin", "password"), verify="gateway.pem")
File "C:Python27libsite-packagesrequests-2.0.0-py2.7.eggrequestsapi.py", line 55, in get
return request("get", url, **kwargs)
File "C:Python27libsite-packagesrequests-2.0.0-py2.7.eggrequestsapi.py", line 44, in request
return session.request(method=method, url=url, **kwargs)
File "C:Python27libsite-packagesrequests-2.0.0-py2.7.eggrequestssessions.py", line 357, in request
resp = self.send(prep, **send_kwargs)
File "C:Python27libsite-packagesrequests-2.0.0-py2.7.eggrequestssessions.py", line 460, in send
r = adapter.send(request, **kwargs)
File "C:Python27libsite-packagesrequests-2.0.0-py2.7.eggrequestsadapters.py", line 358, in send
raise SSLError(e)
SSLError: hostname "10.76.92.70" doesn"t match u"lital.com"

Comment cela peut-il être fait?

Réponses:

8 pour la réponse № 1

Les requêtes ne le permettent pas directement, mais vous pouvez fournir un adaptateur de transport personnalisé qui utilise les fonctionnalités du sous-jacent urllib3. L'utilisation d'adaptateurs de transport est couverte dans la documentation des demandes.

Ce code n'est pas testé, mais devrait fonctionner.

from requests.adapters import HTTPAdapter
from requests.packages.urllib3.poolmanager import PoolManager


# Never check any hostnames
class HostNameIgnoringAdapter(HTTPAdapter):
def init_poolmanager(self, connections, maxsize, block=False):
self.poolmanager = PoolManager(num_pools=connections,
maxsize=maxsize,
block=block,
assert_hostname=False)


# Check a custom hostname
class CustomHostNameCheckingAdapter(HTTPAdapter):
def cert_verify(self, conn, url, verify, cert):
#      implement me
host = custom_function_mapping_url_to_hostname(url)
conn.assert_hostname = host
return super(CustomHostNameCheckingAdapter,
self).cert_verify(conn, url, verify, cert)

En détail le assert_hostname param fonctionne comme suit: Si None utilisez le nom d'hôte de l'URL, si False supprimer la vérification du nom d'hôte, si une chaîne personnalisée est validée par rapport à cette chaîne.


4 pour la réponse № 2

Je suis un peu en retard à la fête mais requests_toolbelt semble que cela pourrait aider si vous installez la version 0.7.0 ou plus récente (mon ubuntu 16.04 n'a que 0.6.0): https://toolbelt.readthedocs.io/en/latest/adapters.html#hostheaderssladapter

Du lien:

Example usage:
>>> s.mount("https://", HostHeaderSSLAdapter())
>>> s.get("https://93.184.216.34", headers={"Host": "example.org"})

1 pour la réponse № 3

Avez-vous regardé dans le SSLContext.check_hostname paramètre? Vous devriez pouvoir le définir sur False, et il ne devrait pas vérifier le nom d'hôte:

context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
context.verify_mode = ssl.CERT_REQUIRED
context.check_hostname = True
context.load_default_certs()

La seule limitation est que cela ne fonctionne que dans Python 3.4 et versions ultérieures.

Référence: https://docs.python.org/3/library/ssl.html#ssl.SSLContext.check_hostname


-2 pour la réponse № 4

http://docs.python-requests.org/en/latest/user/advanced/#ssl-cert-verification

verify Le mot clé est un indicateur, pas pour fournir un fichier cert. Vous avez fourni une chaîne non-empy, qui se résout en True dans un contexte booléen.

Utilisation cert= mot-clé pour fournir le chemin d'accès aux fichiers de certificat ou désactiver la vérification avec verify=False.

MODIFIER: bien que la documentation indique que vous pouvez réellement passer le chemin CA à verify=, mais il n'y a pas d'exemples. Il serait utile de voir l'intégralité de la trace que vous recevez.


-3 pour la réponse № 5

Si ce n'est que pour des tests, ajoutez simplement une entrée dans / etc / hosts à votre système local (en supposant que vous y ayez accès).