it-swarm.com.de

die Verwendung von Anforderungen mit TLS bietet keine SNI-Unterstützung

Ich verwende Anfragen, um mit einer Django-App zu kommunizieren

Wenn ich es versuche

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

Ich bekomme den Fehler:

hostname 'mysite.com' stimmt nicht mit '* .myhost.com', 'myhost.com' überein

Wenn ich jedoch den Browser oder http://www.digicert.com/help/ anschaue, sieht das Zertifikat gut aus.

Mein Host schlug vor, dass es keine SNI-Unterstützung durch Anfragen gab (und Github scheint zu bestätigen, dass https://github.com/kennethreitz/requests/issues/749 ). Hat jemand eine Problemumgehung mit Anfragen gefunden?

58
Massagran

Die aktuelle Version von Requests sollte mit SNI gut funktionieren. Weiter unten in der GitHub-Ausgabe Sie können die Anforderungen sehen:

Versuchen Sie, diese Pakete zu installieren, und versuchen Sie es erneut.

EDIT: Ab Requests v2.12.1 sind ndg-httpsclient und pyasn1 nicht mehr erforderlich. Die vollständige Liste der erforderlichen Pakete ist jetzt:

  • pyOpenSSL
  • idna
123
Lukasa

Damit ich die akzeptierte Antwort erhalten kann, musste ich ein paar andere Pakete in dieser Reihenfolge installieren:

  • yum installiere libffi-devel 
  • yum install gcc 
  • yum install openssl-devel
  • pip install urllib3
  • pip install pyopenssl
  • pip install ndg-httpsclient
  • pip install pyasn1
22
Shane N

Installieren Sie das Anforderungsmodul wie folgt. Dadurch werden die Sicherheitspaket-Extras installiert.

pip install requests[security]

8
Nandeesh

Oder Sie können Python 2.7.9 oder höher verwenden:

"Das gesamte SSL-Modul von Python 3.4 wurde für Python 2.7.9 zurückportiert. Zur Begründung siehe PEP 466."

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

6
stantonk

Die @Lukasa-Antwort ist mit den aktuellen Anfragen (von Github) korrekt. Denken Sie daran, OpenSSL in Ihr System aufzunehmen, abgesehen von den Pip-Abhängigkeiten, die er erwähnt.

Wenn Sie aus Gründen der Bereitstellung eine stabile Anforderungsversion wie die Version 1.2.3 in pip bevorzugen, können Sie die Patch-Version dieser Version so anpassen, dass sie mit SNI wie folgt funktioniert:

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

Kopieren Sie meine Antwort von Zugriff auf https-Sites mit IP-Adresse

Auf MAC High Sierra und Python 3.6.4 habe ich die Lösung ausprobiert: Requests toolbelt: HostHeaderSSLAdapter 1. Leider funktioniert es bei mir nicht, dann habe ich versucht forcediphttpsadapter , es funktioniert endlich.

Der Autor erklärt alles im Readme-Teil und hat ein Beispielskript zur Verfügung gestellt, das leicht verfolgt werden kann.

1.Installieren Sie die Bibliothek mit pip install requests[security] forcediphttpsadapter

2. Führen Sie das Beispielskript aus:

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)

Hinweis: In einigen Fällen müssen Sie möglicherweise das Präfix "www" von der URL entfernen.

0
69444091