HTTPS-Verbindung Python
Frage
Ich versuche zu überprüfen, die das Ziel stellt eine https-web-service.Ich habe code, um eine Verbindung über HTTP, aber ich bin mir nicht sicher, wie die Verbindung über HTTPS.Ich habe gelesen, Sie SSL verwenden, aber ich habe auch gelesen, dass es nicht unterstützt Zertifikat Fehler.Der code, den ich habe, ist aus der python-Dokumentation:
import httplib
conn = httplib.HTTPConnection("www.python.org")
conn.request("GET", "/index.html")
r1 = conn.getresponse()
print r1.status, r1.reason
Weiß jemand, wie man die Verbindung zu HTTPS?
Ich habe bereits versucht, die HTTPSConenction aber es antwortet mit einem Fehler-code fordern httplib nicht Attribut HTTPSConnection.Ich auch nicht-socket.ssl verfügbar.
Ich habe installiert Python 2.6.4 und ich glaube nicht, dass Sie die SSL-Unterstützung kompiliert werden.Gibt es eine Möglichkeit, zu integrieren suppot in die neuere python-zimmerreserviereung, ohne das Sie installieren es wieder.
Ich habe OpenSSL installiert und pyOpenSsl und ich habe versucht, den folgenden code aus einer der Antworten:
import urllib2
from OpenSSL import SSL
try:
response = urllib2.urlopen('https://example.com')
print 'response headers: "%s"' % response.info()
except IOError, e:
if hasattr(e, 'code'): # HTTPError
print 'http error code: ', e.code
elif hasattr(e, 'reason'): # URLError
print "can't connect, reason: ", e.reason
else:
raise
Ich habe einen Fehler:
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "/home/build/workspace/downloads/Python-2.6.4/Lib/urllib.py", line 87, in urlopen
return opener.open(url)
File "/home/build/workspace/downloads/Python-2.6.4/Lib/urllib.py", line 203, in open
return self.open_unknown(fullurl, data)
File "/home/build/workspace/downloads/Python-2.6.4/Lib/urllib.py", line 215, in open_unknown
raise IOError, ('url error', 'unknown url type', type)
IOError: [Errno url error] unknown url type: 'https'
Weiß jemand, wie dies funktioniert?
-- UPDATE
Ich habe herausgefunden, was das problem war, dass die Python-version nutze ich nicht haben die Unterstützung für SSL.Ich fand diese Lösung derzeit: http://www.webtop.com.au/compiling-python-with-ssl-support.
Der code funktioniert jetzt auch nach dieser Lösung, die ist sehr gut.Wenn ich importieren Sie ssl-und HTTPSConnection ich weiß nicht, bekomme eine Fehlermeldung.
Vielen Dank für die Hilfe aller.
Lösung
Python 2.x: docs.python.org/2/library/httplib.html:
Hinweis:HTTPS-Unterstützung ist nur verfügbar, wenn die socket-Modul kompiliert wurde mit SSL-Unterstützung.
Python-3.x: docs.python.org/3/library/http.client.html:
Hinweis: HTTPS-Unterstützung ist nur verfügbar, wenn Python kompiliert wurde, mit SSL-Unterstützung (durch das ssl-Modul).
#!/usr/bin/env python
import httplib
c = httplib.HTTPSConnection("ccc.de")
c.request("GET", "/")
response = c.getresponse()
print response.status, response.reason
data = response.read()
print data
# =>
# 200 OK
# <!DOCTYPE html ....
Um zu überprüfen, ob SSL aktiviert ist, versuchen Sie:
>>> import socket
>>> socket.ssl
<function ssl at 0x4038b0>
Andere Tipps
Überprüfen ssl-Unterstützung in Python 2.6+:
try:
import ssl
except ImportError:
print "error: no ssl support"
Stellen Sie eine Verbindung über https:
import urllib2
try:
response = urllib2.urlopen('https://example.com')
print 'response headers: "%s"' % response.info()
except IOError, e:
if hasattr(e, 'code'): # HTTPError
print 'http error code: ', e.code
elif hasattr(e, 'reason'): # URLError
print "can't connect, reason: ", e.reason
else:
raise
Verwendung
class httplib.HTTPSConnection
http://docs.python.org/library/httplib.html#httplib.HTTPSConnection
import requests
r = requests.get("https://stackoverflow.com")
data = r.content # Content of response
print r.status_code # Status code of response
print data
Warum haben Sie nicht versucht, httplib.HTTPSConnection?Es nicht, die SSL-überprüfung, aber dies ist nicht erforderlich, eine Verbindung über https.Ihr code funktioniert mit https-Verbindung:
>>> import httplib
>>> conn = httplib.HTTPSConnection("mail.google.com")
>>> conn.request("GET", "/")
>>> r1 = conn.getresponse()
>>> print r1.status, r1.reason
200 OK
Wenn Sie mit httplib.HTTPSConnection:
Bitte werfen Sie einen Blick auf:Änderungen in version 2.7.9:
Diese Klasse führt nun alle notwendigen Zertifikat und den Hostnamen überprüft standardmäßig.Zur Wiederherstellung der vorherigen, nicht überprüfte, Verhalten ssl._create_unverified_context() übergeben werden kann, um die context-parameter.Sie können verwenden:
if hasattr(ssl, '_create_unverified_context'):
ssl._create_default_https_context = ssl._create_unverified_context
Vorausgesetzt, die SSL-Unterstützung aktiviert ist, für die socket
Modul.
connection1 = httplib.HTTPSConnection('www.somesecuresite.com')
Ich hatte einige code, der wurde nicht mit einer HTTPConnection (MOVED_PERMANENTLY error)
,, aber sobald ich eingeschaltet, um HTTPS
es funktionierte wieder einwandfrei ohne andere änderungen erforderlich.Das ist eine sehr einfache Lösung!