Conexión HTTPS Python
Pregunta
Estoy tratando de verificar el destino que expone un servicio web https.Tengo el código para conectarse a través de HTTP, pero no estoy seguro de cómo conectarse a través de HTTPS.He leído que el uso de SSL, pero también he leído que no es partidaria de errores de certificado.El código que tengo es de python docs:
import httplib
conn = httplib.HTTPConnection("www.python.org")
conn.request("GET", "/index.html")
r1 = conn.getresponse()
print r1.status, r1.reason
¿Alguien sabe cómo conectar con HTTPS?
Ya he probado el HTTPSConenction sino que responde con un código de error alegando httplib no tiene atributo HTTPSConnection.Yo también no tiene socket.ssl disponible.
He instalado Python 2.6.4 y creo que no tiene soporte SSL compilado en ella.Es allí una manera de integrar este soporta en la nueva python sin tener que instalarlo de nuevo.
He instalado OpenSSL y pyOpenSsl y he probado el código de abajo de una de las respuestas:
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
Tengo un error:
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'
¿Alguien sabe cómo conseguir este trabajo?
-- UPDATE
Me he enterado de cuál era el problema, la versión de Python que estaba usando no tiene soporte para SSL.He encontrado esta solución actualmente en: http://www.webtop.com.au/compiling-python-with-ssl-support.
El código de trabajo después de esta solución, que es muy bueno.Cuando me importación ssl y HTTPSConnection sé que no es un error.
Gracias por la ayuda a todos.
Solución
Python 2.x: docs.python.org/2/library/httplib.html:
Nota:HTTPS apoyo sólo está disponible si el módulo zócalos fue compilado con soporte SSL.
Python 3.x: docs.python.org/3/library/http.client.html:
Nota HTTPS apoyo sólo está disponible si Python fue compilado con soporte SSL (a través del módulo ssl).
#!/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 ....
Para comprobar si SSL está habilitado, trate de:
>>> import socket
>>> socket.ssl
<function ssl at 0x4038b0>
Otros consejos
Para comprobar el soporte ssl en Python 2.6+:
try:
import ssl
except ImportError:
print "error: no ssl support"
Para conectarse a través de 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
el uso de
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
¿Por qué no has intentado httplib.HTTPSConnection?No hace SSL de validación, pero esto no es necesario para conectarse a través de https.El código funciona bien con conexión https:
>>> import httplib
>>> conn = httplib.HTTPSConnection("mail.google.com")
>>> conn.request("GET", "/")
>>> r1 = conn.getresponse()
>>> print r1.status, r1.reason
200 OK
Si el uso de httplib.HTTPSConnection:
Por favor, echa un vistazo a:Cambiado en la versión 2.7.9:
Esta clase realiza todo el necesario certificado y el nombre del host controles por defecto.Para volver a la anterior, verificada, el comportamiento de ssl._create_unverified_context() se puede pasar al parámetro de contexto.Usted puede utilizar:
if hasattr(ssl, '_create_unverified_context'):
ssl._create_default_https_context = ssl._create_unverified_context
Suponiendo que el soporte SSL está habilitado para la socket
el módulo.
connection1 = httplib.HTTPSConnection('www.somesecuresite.com')
Yo tenía algo de código que se estaba produciendo un HTTPConnection (MOVED_PERMANENTLY error)
, pero tan pronto como me pasa a HTTPS
funcionó perfectamente de nuevo con ningún otro de los cambios necesarios.Eso es muy sencillo de arreglar!