web-dev-qa-db-fra.com

l'utilisation de requêtes avec TLS n'assure pas le support de SNI

J'utilise des requêtes pour communiquer avec une application Django mais

Quand j'essaye

requests.get('https://mysite.com', verify=True)

Je reçois l'erreur:

le nom d'hôte 'mysite.com' ne correspond à aucun des noms '* .myhost.com', 'myhost.com'

Cependant, quand je regarde le navigateur, ou http://www.digicert.com/help/ le certificat a l’air parfait.

Mon hôte a suggéré que c’était le manque de soutien SNI des requêtes (et Github semble confirmer que https://github.com/kennethreitz/requests/issues/749 ). Quelqu'un at-il trouvé une solution de contournement en utilisant des demandes?

58
Massagran

La version actuelle de Requests devrait convenir à SNI. Plus bas dans le numéro de GitHub vous pouvez voir les exigences:

Essayez d’installer ces paquets, puis essayez-le encore une fois.

EDIT: à partir de Requêtes v2.12.1, ndg-httpsclient et pyasn1 ne sont plus nécessaires. La liste complète des paquets requis est maintenant:

  • pyOpenSSL
  • idna
123
Lukasa

Pour que la réponse acceptée fonctionne, j'ai dû installer plusieurs autres packages, dans cet ordre:

  • miam installer libffi-devel 
  • miam installer gcc 
  • miam installer openssl-devel
  • pip installer urllib3
  • pip installer pyopenssl
  • pip installer ndg-httpsclient
  • pip installer pyasn1
22
Shane N

Installez le module de demandes comme ceci. Cela installera les extras du paquet de sécurité.

pip install requests[security]

8
Nandeesh

Ou vous pouvez simplement utiliser Python 2.7.9 et plus:

"L'intégralité du module ssl de Python 3.4 a été rétroporté pour Python 2.7.9. Voir PEP 466 pour la justification."

https://www.python.org/downloads/release/python-279/

6
stantonk

@Lukasa answer est correct avec les demandes présentes (de github). N'oubliez pas d'ajouter OpenSSL dans votre système aussi, indépendamment des dépendances de pip qu'il mentionne.

Si, pour des raisons de déploiement, vous préférez une version de requête stable telle que la version 1.2.3 dans pip, vous pouvez corriger cette dernière pour qu'elle fonctionne avec SNI, comme ceci:

import requests


def fileno(self):
    return self.socket.fileno()


def close(self):
    return self.connection.shutdown()


requests.pyopenssl.WrappedSocket.close = close
requests.pyopenssl.WrappedSocket.fileno = fileno
4
AntonioMO

Copier ma réponse depuis Accéder aux sites https avec adresse IP

Sur MAC High Sierra et Python 3.6.4, j'ai essayé la solution: toolsbelt: HostHeaderSSLAdapter 1ère, malheureusement, cela ne fonctionne pas pour moi, puis j'ai essayé Forceiphttpsadapter , ça marche enfin.

L'auteur explique tout dans la partie readme et a fourni un exemple de script qui peut être suivi facilement.

1.Installez la bibliothèque par pip install requests[security] forcediphttpsadapter

2.exécutez l'exemple de script:

import requests
from forcediphttpsadapter.adapters import ForcedIPHTTPSAdapter
session = requests.Session()
session.mount("https://example.com", ForcedIPHTTPSAdapter(dest_ip='1.2.3.4'))
response = session.get(
    '/some/path', headers={'Host': 'example.com'}, verify=False)

Remarque: Dans certains cas, vous devrez peut-être supprimer le préfixe: "www" de l'URL.

0
69444091