In Python 3.2, ich kann Sie öffnen und Lesen Sie eine HTTPS-Webseite mit http.client, aber das urllib.Anfrage nicht öffnen derselben Seite
Möchte ich öffnen und Lesen https://yande.re/ mit urllib.request
, aber ich bin immer ein " SSL-Fehler. Ich kann Sie öffnen und Lesen Sie die Seite einfach 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()
Jedoch, den folgenden code verwenden urllib.request
ausfällt:
import urllib.request
opener = urllib.request.build_opener()
resp = opener.open('https://yande.re/')
data = resp.read()
Es gibt mir die 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 geöffnet.öffnen?
Edit: Hier ist meine OpenSSL-version und die Rückverfolgung von versuchen, Sie zu öffnen https://yande.re/
>>> 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>
>>>
- Können Sie fügen Sie die Ausgabe von
import ssl; ssl.OPENSSL_VERSION
, und das Ergebnisurllib.request.urlopen('https://yande.re/')
- FWIW, wahrscheinlich ein Datenpunkt für die Fehlersuche. Das äquivalent in Python 2.7.x-code (siehe unten) gut funktioniert : import urllib2 req = urllib2.Request('yande.re') bzw = urllib2.urlopen(req) resp.read()
- code für http.client ist falsch. Sie könnte bedeuten:
conn.request('GET', '/')
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was für ein Zufall! Ich habe das gleiche problem wie du, mit einer zusätzlichen Komplikation: ich bin hinter einem proxy. Ich fand diese bug-report über https-nicht-arbeiten-mit-das urllib. Zum Glück, Sie erzielte einen workaround.
Btw, Dank für die zeigen, wie zu verwenden
http.client
. Ich wusste nicht, dass es eine andere Bibliothek, die verwendet werden können, um mit dem internet verbinden. 😉Dies ist aufgrund einer Fehler in den frühen 1.x OpenSSL-Implementierung der elliptic curve cryptography. Nehmen Sie einen genaueren Blick auf den relevanten Teil der Ausnahme:
Dies ist ein Fehler von der zugrunde liegenden OpenSSL-Bibliothek von code, der ein Ergebnis des falschen Umgangs mit der EG-point-format TLS-Erweiterung. Eine Problemumgehung ist die Verwendung der SSLv3 statt SSLv23 Methode, die andere Problemumgehung ist die Verwendung einer cipher-suite-Spezifikation, die deaktiviert alle ECC cipher suites (ich hatte gute Ergebnisse mit
ALL:-ECDH
verwendenopenssl ciphers
zum testen). Das Update ist ein update von OpenSSL.Ist das problem durch den Hostnamen ein, dass Ihre Spenden in den beiden Beispielen:
und...
Beachten Sie, dass im ersten Beispiel, Fragen Sie den client, um eine Verbindung zu dem host: http://www.yande.re und im zweiten Beispiel, das urllib zunächst wird die url analysiert 'https://yande.re" und dann versuchen, eine Anfrage an den host-yande.re
Obwohl http://www.yande.re und yande.re beheben kann, um die gleiche IP-Adresse, aus der Perspektive der die web-server-diese sind verschiedene virtuelle hosts. Meine Vermutung ist, dass Sie hatte eine SNI problem mit der Konfiguration auf Ihrem web-server-Seite. Zu sehen, wie die ursprüngliche Frage wurde gepostet am Mai 21, und den aktuellen cert auf yande.re startet Mai 28, ich denke, dass Sie schon Fix für dieses problem?
conn.request('GET', '/')
Versuchen Sie dies: