2012-06-29 21 views
5

Solo intento configurar un simple servidor SSL. Nunca antes había tenido algo de SSL que funcione para mí. Tengo un conocimiento amplio de cómo los certificados SSL y la firma.Python Simple SSL Socket Server

El código es simple

import socket, ssl 

context = ssl.SSLContext(ssl.PROTOCOL_TLSv1) 
context.load_cert_chain(certfile="mycertfile") ############### 

bindsocket = socket.socket() 
bindsocket.bind(('', 2099)) 
bindsocket.listen(5) 

while True: 
    newsocket, fromaddr = bindsocket.accept() 
    sslsoc = context.wrap_socket(newsocket, server_side=True) 
    request = sslsoc.read() 
    print(request) 

La línea de allí con el ### s después de que es el que isnt de trabajo. No sé qué tengo que hacer con openssl para generar un archivo PEM que funcionará aquí.

¿Alguien me puede aclarar cómo hacer que este simple socket funcione?

Por cierto, esto NO se utiliza para HTTP.

+0

Si está dispuesto a usar twisted, aquí hay un buen ejemplo que usa OpenSSL: http://twistedmatrix.com/documents/current/core/howto/ssl.html Parece que eso requiere un certificado y una clave pública, donde el certificado se firma con el par privado de la clave pública. – jozzas

+0

Eso es bueno y parece bastante simple, pero todo lo que necesito son los comandos para generar el archivo correcto para usar. Lo intenté hace un tiempo pero recibí errores muy extraños. Oviously no lo he firmado correctamente o uso el archivo correcto. – Caprin

+0

Parece que hay muchos tutoriales para esto, ¿ha intentado seguir este, por ejemplo? http://devsec.org/info/ssl-cert.html – jozzas

Respuesta

8

puede utilizar este comando para generar un certificado autofirmado

openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout cert.pem 

el marco openssl le pedirá que introduzca información personal, como su país, ciudad, etc. sólo tienes que seguir las instrucciones, y usted obtendrá un archivo cert.pem. el archivo de salida tendrá su clave privada RSA, con la que puede generar su clave pública, y el certificado. el archivo de salida se ve así:

-----BEGIN RSA PRIVATE KEY----- 
# your private key 
-----END RSA PRIVATE KEY----- 
-----BEGIN CERTIFICATE----- 
# your certificate 
-----END CERTIFICATE----- 

simplemente cargarlo, y el módulo SSL se encargará del resto para usted:

context.load_cert_chain(certfile="cert.pem", keyfile="cert.pem") 

Por cierto, hay sin "SSLContext" en python2. para los chicos que están utilizando python2, simplemente asignar el archivo PEM al envolver socket:

newsocket, fromaddr = bindsocket.accept() 
connstream = ssl.wrap_socket(newsocket, 
          server_side=True, 
          certfile="cert.pem", 
          keyfile="cert.pem", 
          ssl_version=YOUR CHOICE) 

disponible la versión SSL: ssl.PROTOCOL_TLSv1, ssl.PROTOCOL_SSLv2, ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_SSLv23. si no tiene idea, ssl.PROTOCOL_SSLv23 puede ser su elección, ya que proporciona la mayor compatibilidad con otras versiones.

+1

para crear la función 'context', call' ssl.create_default_context' (también funciona en las versiones recientes de Python 2). – jfs

+0

Sé que esta es una publicación anterior, pero debido a la vulnerabilidad de POODLE, nadie debería recomendar el uso de SSLv3 sobre TLS. Más información en https://en.wikipedia.org/wiki/POODLE – fileinster