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?
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:
Pour que la réponse acceptée fonctionne, j'ai dû installer plusieurs autres packages, dans cet ordre:
Installez le module de demandes comme ceci. Cela installera les extras du paquet de sécurité.
pip install requests[security]
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."
@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
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.