2010-01-27 28 views
34

Estoy intentando verificar que ese objetivo expone un servicio web https. Tengo un código para conectarme a través de HTTP pero no estoy seguro de cómo conectarme a través de HTTPS. Leí que usa SSL, pero también he leído que no admite errores de certificado. El código que tengo es de python docs:Conexión HTTPS Python

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 conectarse a HTTPS?

Ya probé la HTTPSConenction pero responde con un código de error que afirma que httplib no tiene el atributo HTTPSConnection. Tampoco tengo socket.ssl ​​disponible.

He instalado Python 2.6.4 y no creo que tenga el soporte SSL compilado en él. ¿Hay alguna manera de integrar este suppot en el python más nuevo 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 ¿trabajando?

-- UPDATE 

He descubierto cuál era el problema, la versión de Python que estaba usando no tenía soporte para SSL. Encontré esta solución actualmente en: http://www.webtop.com.au/compiling-python-with-ssl-support.

El código ahora funcionará después de esta solución que es muy buena. Cuando importo ssl y HTTPSConnection, sé que no aparece un error.

Gracias por la ayuda a todos.

Respuesta

59

Python 2.x: docs.python.org/2/library/httplib.html:

Note: HTTPS support is only available if the socket module was compiled with SSL support.

Python 3.x: docs.python.org/3/library/http.client.html:

Note HTTPS support is only available if Python was compiled with SSL support (through the ssl module).

#!/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 verificar si SSL está habilitado, intente:

>>> import socket 
>>> socket.ssl 
<function ssl at 0x4038b0> 
+8

Tenga en cuenta que esto no verifica el certificado remoto, por lo tanto, realmente no obtiene la seguridad de esta manera (ya que realmente no sabe con qué servidor está hablando realmente). – Bruno

+0

El enlace está muerto. – SwiftsNamesake

3

Por qué no has necesitado httplib.HTTPSConnection? No hace la validación SSL, pero esto no es necesario para conectarse a través de https. Su código funciona bien con la conexión https:

>>> import httplib 
>>> conn = httplib.HTTPSConnection("mail.google.com") 
>>> conn.request("GET", "/") 
>>> r1 = conn.getresponse() 
>>> print r1.status, r1.reason 
200 OK 
4

Suponiendo que la compatibilidad SSL está habilitada para el módulo socket.

connection1 = httplib.HTTPSConnection('www.somesecuresite.com') 
11

Para comprobar si hay ssl support in Python 2.6+:

try: 
    import ssl 
except ImportError: 
    print "error: no ssl support" 

para conectarse a través 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 
+4

+1 para usar 'example.com'. – jww

5
import requests 
r = requests.get("https://stackoverflow.com") 
data = r.content # Content of response 

print r.status_code # Status code of response 
print data 
5

Si se utiliza httplib.HTTPSConnection:

Por favor, eche un vistazo a: Modificado en la versión 2.7.9:

Esta clase ahora realiza todos los certificados necesarios y las verificaciones del nombre de host de forma predeterminada. Para volver al comportamiento anterior, no verificado, ssl._create_unverified_context() se puede pasar al parámetro de contexto. Se puede utilizar:

if hasattr(ssl, '_create_unverified_context'): 
      ssl._create_default_https_context = ssl._create_unverified_context 
0

que tenía un código que fallaba con un HTTPConnection (MOVED_PERMANENTLY error), pero tan pronto como me pasa a HTTPS funcionó perfectamente de nuevo sin otros cambios necesarios. ¡Es una solución muy simple!

+0

¿En qué se diferencia esto de otras respuestas? Tal vez intente elaborar un poco más. – mpaskov

Cuestiones relacionadas