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.

¿Fue útil?

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
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!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top