Necesito crear un canal seguro entre el servidor y un servicio web remoto. Voy a ser el uso de HTTPS con un certificado de cliente. También tendrás que validar el certificado presentado por el servicio remoto.

  1. ¿Cómo puedo usar mi propio certificado de cliente con urllib2?
  2. ¿Qué tengo que hacer en mi código para asegurarse de que el certificado remoto es correcto?

OriginalEl autor Ned Batchelder | 2009-12-09

4 Comentarios

  1. 33

    Porque alex de la respuesta es un enlace, y el código de la página está mal formateado, solo voy a poner esto aquí para la posteridad:

    import urllib2, httplib
    
    class HTTPSClientAuthHandler(urllib2.HTTPSHandler):
        def __init__(self, key, cert):
            urllib2.HTTPSHandler.__init__(self)
            self.key = key
            self.cert = cert
    
        def https_open(self, req):
            # Rather than pass in a reference to a connection class, we pass in
            # a reference to a function which, for all intents and purposes,
            # will behave as a constructor
            return self.do_open(self.getConnection, req)
    
        def getConnection(self, host, timeout=300):
            return httplib.HTTPSConnection(host, key_file=self.key, cert_file=self.cert)
    
    opener = urllib2.build_opener(HTTPSClientAuthHandler('/path/to/file.pem', '/path/to/file.pem.') )
    response = opener.open("https://example.org")
    print response.read()
    Muchas gracias por esto! He sido el seguimiento de un error por días, utilizando un certificado privado y certificado de autoridad para conectarse a un servidor Apache usando la solicitud de la biblioteca de python. Pude comprobar que mi certificado de trabajo en el navegador, sin embargo, no todos los tiempo con un «apretón de manos error» que terminó con la clase anterior para demostrar que el certificado de cliente estaba trabajando y se autentica correctamente. Resultó que no era un error en la versión de las solicitudes de la biblioteca que estaba usando 1.2.3 para ser exactos. Espero que este comentario ayuda a otras personas que están encontrando con el mismo problema.
    Soy nuevo en Python, así que me gustaría saber cuando es el https_open() la función se llama aquí? Si es posible por favor describa lo que es el flujo de ejecución de este código?
    Así que he seguido estas instrucciones y me estoy haciendo un urlopen de error: «ssl certificate verify failed» cuando yo uso python 2.7.9 o mayor. Creo que tengo que agregar una SSLContext con mi propio certificado de la cadena, pero no estoy 100% seguro, ¿te importaría darle ningún consejo o sugerencias sobre el trabajo que en su ejemplo aquí. Gracias!

    OriginalEl autor tghw

  2. 4

    Por Antoine Pitrou la respuesta a la cuestión vinculada en Hank Gay de la respuesta, esto puede ser simplificado algo (de 2011) mediante el que se incluyen ssl biblioteca:

    import ssl
    import urllib.request
    
    context = ssl.create_default_context()
    context.load_cert_chain('/path/to/file.pem', '/path/to/file.key')
    opener = urllib.request.build_opener(urllib.request.HTTPSHandler(context=context))
    response = opener.open('https://example.org')
    print(response.read())

    (Python 3 código, pero el ssl biblioteca también está disponible en Python 2).

    La load_cert_chain función también acepta un parámetro de contraseña opcional, lo que permite la clave privada de cifrado.

    OriginalEl autor Leynos

Dejar respuesta

Please enter your comment!
Please enter your name here