In Python 3.2 kann ich eine HTTPS-Webseite mit http.client öffnen und lesen, aber urllib.request scheitert, die gleiche Seite zu öffnen

Ich möchte mit https://yande.re/ mit urllib.request öffnen und lesen, aber ich bekomme einen SSL-Fehler. Ich kann öffnen und lesen Sie die Seite ganz gut mit http.client mit diesem Code:

 import http.client conn = http.client.HTTPSConnection('www.yande.re') conn.request('GET', 'https://yande.re/') resp = conn.getresponse() data = resp.read() 

Der folgende Code, der urllib.request schlägt urllib.request fehl:

 import urllib.request opener = urllib.request.build_opener() resp = opener.open('https://yande.re/') data = resp.read() 

Es gibt mir folgende Fehlermeldung: ssl.SSLError: [Errno 1] _ssl.c:392: error:1411809D:SSL routines:SSL_CHECK_SERVERHELLO_TLSEXT:tls invalid ecpointformat list . Warum kann ich die Seite mit HTTPSConnection aber nicht opener.open öffnen?

Bearbeiten: Hier ist meine OpenSSL Version und der Traceback zu versuchen, https://yande.re/ zu öffnen

 >>> import ssl; ssl.OPENSSL_VERSION 'OpenSSL 1.0.0a 1 Jun 2010' >>> import urllib.request >>> urllib.request.urlopen('https://yande.re/') Traceback (most recent call last): File "<pyshell#3>", line 1, in <module> urllib.request.urlopen('https://yande.re/') File "C:\Python32\lib\urllib\request.py", line 138, in urlopen return opener.open(url, data, timeout) File "C:\Python32\lib\urllib\request.py", line 369, in open response = self._open(req, data) File "C:\Python32\lib\urllib\request.py", line 387, in _open '_open', req) File "C:\Python32\lib\urllib\request.py", line 347, in _call_chain result = func(*args) File "C:\Python32\lib\urllib\request.py", line 1171, in https_open context=self._context, check_hostname=self._check_hostname) File "C:\Python32\lib\urllib\request.py", line 1138, in do_open raise URLError(err) urllib.error.URLError: <urlopen error [Errno 1] _ssl.c:392: error:1411809D:SSL routines:SSL_CHECK_SERVERHELLO_TLSEXT:tls invalid ecpointformat list> >>> 

4 Solutions collect form web for “In Python 3.2 kann ich eine HTTPS-Webseite mit http.client öffnen und lesen, aber urllib.request scheitert, die gleiche Seite zu öffnen”

Was für ein Zufall! Ich habe das gleiche Problem wie du bist, mit einer zusätzlichen Komplikation: Ich bin hinter einem Proxy. Ich habe diesen Fehlerbericht über https-not-working-with-urllib gefunden. Zum Glück haben sie einen Workaround gepostet.

 import urllib.request import ssl ##uncomment this code if you're behind a proxy ##https port is 443 but it doesn't work for me, used port 80 instead ##proxy_auth = '{0}://{1}:{2}@{3}'.format('https', 'username', 'password', ## 'proxy:80') ##proxies = { 'https' : proxy_auth } ##proxy = urllib.request.ProxyHandler(proxies) ##proxy_auth_handler = urllib.request.HTTPBasicAuthHandler() ##opener = urllib.request.build_opener(proxy, proxy_auth_handler, ## https_sslv3_handler) https_sslv3_handler = urllib.request.HTTPSHandler(context=ssl.SSLContext(ssl.PROTOCOL_SSLv3)) opener = urllib.request.build_opener(https_sslv3_handler) urllib.request.install_opener(opener) resp = opener.open('https://yande.re/') data = resp.read().decode('utf-8') print(data) 

Btw, danke für das http.client . Ich wusste nicht, dass es noch eine Bibliothek gibt, mit der man sich mit dem Internet verbinden kann. 😉

Dies ist aufgrund eines Bugs in der frühen 1.x OpenSSL Implementierung der elliptischen Kurve Kryptographie . Schauen Sie sich den relevanten Teil der Ausnahme genauer an:

 _ssl.c:392: error:1411809D:SSL routines:SSL_CHECK_SERVERHELLO_TLSEXT:tls invalid ecpointformat list 

Dies ist ein Fehler aus dem zugrundeliegenden OpenSSL-Bibliothekscode, der ein Ergebnis der Misshandlung der EC-Punktformat-TLS-Erweiterung ist. Ein Workaround ist, die SSLv3 anstelle von SSLv23-Methode zu verwenden, die andere Problemumgehung ist, eine Chiffre-Suite-Spezifikation zu verwenden, die alle ECC-Chiffre-Suiten deaktiviert (ich hatte gute Ergebnisse mit ALL:-ECDH , verwenden Sie openssl ciphers zum Testen). Das Update soll OpenSSL aktualisieren.

Das Problem liegt an den Hostnamen, die Sie in den beiden Beispielen geben:

 import http.client conn = http.client.HTTPSConnection('www.yande.re') conn.request('GET', 'https://yande.re/') 

und…

 import urllib.request urllib.request.urlopen('https://yande.re/') 

Beachten Sie, dass Sie im ersten Beispiel den Client bitten, eine Verbindung zum Host herzustellen: http://www.yande.re und im zweiten Beispiel wird urllib zuerst die URL "https://yande.re&quot; analysieren und dann versuchen Eine anfrage an der host yande.re

Obwohl http://www.yande.re und yande.re auf die gleiche IP-Adresse auflösen können, sind aus der Perspektive des Webservers unterschiedliche virtuelle Hosts. Meine Vermutung ist, dass Sie ein SNI- Konfigurationsproblem auf der Seite Ihres Webservers hatten. Als ob die ursprüngliche Frage am 21. Mai veröffentlicht wurde und das aktuelle Zertifikat bei yande.re beginnt 28. Mai, denke ich, dass Sie bereits dieses Problem behoben haben?

Versuche dies:

 import connection #imports connection import url url = 'http://www.google.com/' webpage = url.open(url) try: connection.receive(webpage) except: webpage = url.text('This webpage is not available!') connection.receive(webpage) 
  • Überprüfen Sie auf `urllib.urlretrieve (url, file_name)` Abschlussstatus
  • Python, gegenüberliegende Funktion urllib.urlencode
  • Python 3.5.1 urllib hat keine Attributanfrage
  • Python3: JSON POST Anfrage OHNE Anfragen Bibliothek
  • Multi-Gewinde-Web-Scraper mit urlretrieve auf einem Cookie-fähigen Website
  • Urllib2.HTTPError: HTTP-Fehler 400: Schlechte Anforderung - Python
  • Asynchron bekomme und stelle Bilder in Python auf
  • Anmelden bei einer Website mit Python (urllib, urllib2, cookielib): Wie findet man notwendige Informationen zur Einreichung?
  • Halten Sie die URL-Parameter bei der Codierung mit urllib
  • Python: Wie bekomme ich die Dauer des Betrachtens des Videos durch den Benutzer aus Protokollen
  • Welches Kommando anstelle von urllib.request.urlretrieve verwenden?
  • Python ist die beste Programmiersprache der Welt.