Stunnel: Encriptando las conexiones

Hace poco estuve programando una aplicación para el manejo de usuarios, dominios y base de datos en PHP y utilizando el servidor web interno que tiene PHP para ejecutarla.

El problema que tiene el web interno es que http y no soporta encriptación son TLS/SSL. Por el diseño de la aplicación no la puedo ejecutar dentro de un apache, por lo que utilizo otro server web.

El inconveniente que vaya todo en texto plano, es que al manejar contraseñas e información sensible, ésta puede ser expuesta e interceptada.

Buscando un poco encontre Stunnel, una herramienta que permite hacer túneles SSL. La idea de manera simple es hacer que Stunnel levante con encriptación en algún puerto del servidor. Cuando alguien se intente conectar a ese puerto con SSL, éste internamente lo conectará con el servicio que hayamos configurado y toda la información va encriptada. Se puede visualizar de manera fácil como un proxy para agregar SSL -encriptación por certificados-. Con lo mencionado anteriormente puedo hacer que un tráfico HTTP pueda ser cifrado en HTTPs de manera simple.

Los pasos de la instalación son bastante simples, lo que hay que hacer es instalar la aplicación, crear un certificado y configurar stunel para conectarse con alguna aplicación internamente.

Para instalar la aplicación (ejemplo en Debian/Ubuntu):

apt-get install stunnel
Para crear un certificado:
$> openssl req -new -x509 -days 3650 -nodes -out stunnel.pem -keyout stunnel.pem
$> cp stunnel.pem /etc/stunnel/

Esto nos creará dos certificados, uno privado y otro publico, en un solo archivo llamado stunnel.pem

Archivo de configuración:

nano /etc/stunnel/stunnel.conf

cert = /etc/stunnel/stunnel.pem

[http]
accept = 443
connect = 80

Con este ejemplos estamos configurando que el stunnel acepte conexiones en el puerto 443 y la redireccione hacia el puerto 80.

Habilitando el servicio

nano /etc/default/stunnel4

ENABLED=1

Reiniciando el servicio

/etc/init.d/stunnel4 restart