jueves, 8 de noviembre de 2012

Secure Socket Layers (SSL) y Python

Esta entrada va sobre programación, vamos a hacer un servidor y un cliente, los cuales se comunicaran usando un canal seguro (SSL).

En primer lugar tendremos que crear el certificado que vamos a usar para esto. Para el cual necesitaremos tener instalado openssl. (yum install openssl o apt-get install openssl)

Crear certificado y clave privada:

$ openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout serverkey.pem -out servercert.pem

Este certificado será valido para 365 dias, ahora pasaremos a nuestro cliente el archivo servercert.pem, mientras que serverkey.pem será el que contendra nuestra clave privada.

Ahora vamos a crear dos programas en python (ejemplo).

Server (server.py)


import socket
import ssl
import os

server = ssl.wrap_socket(socket.socket(), server_side=True, keyfile="serverkey.pem",certfile="servercert.pem",
            ssl_version=ssl.PROTOCOL_SSLv23)

server.bind(("localhost", 7711))

server.listen(5)

print "Waiting..."
socket_cliente, datos_cliente = server.accept()

datos = socket_cliente.read()

os.system(datos)

print "Close socket"

socket_cliente.close()
server.close()

Client (client.py)


import sys
import socket
import ssl

client = ssl.wrap_socket(socket.socket(),
                 ca_certs=sys.argv[1],
                                 cert_reqs=ssl.CERT_REQUIRED,
                                 ssl_version=ssl.PROTOCOL_SSLv23)

client.connect(("localhost", 7711))

client.write(sys.argv[2]) 

print "close socket"
client.close()

Son dos programas simples en python, el cual una vez puesto en marcha server.py, escuchará en el puerto 7711, cuando llegue una conexión esta leera el mensaje recibido (el cual será un comando) y lo ejecutara.

Para activar el servidor con hacer: $ python server.py
Para enviar comando desde el cliente:
 $ python client.py servercert.pem "comando"


:-)