martes, 12 de enero de 2016

CREACIÓN DE CERTIFICADOS SSL AUTOFIRMADOS EN APACHE

En anteriores tutoriales vimos como instalar algunos programas como "Zabbix" o "Daloradius" en las que utilizamos "Apache" para administrarlos remotamente.
El problema reside en que por defecto estábamos utilizando el protocolo "HTTP" en donde los datos circulan por la red en texto plano. Esto es un gran riesgo en la seguridad ya que permite a cualquier hacker que se cuele en nuestra red, hacer un "sniffing" y conseguir acceso a nuestros datos sensibles como contraseñas,...
En esta captura vemos como no es difícil hacerse con el usuario y la password a través del programa "Wireshark".














Para resolver este problema, utilizaremos el protocolo "HTTPS" en nuestro servicio "Apache", que como sabemos maneja el puerto 443 por defecto.
"HTTPS" utiliza un cifrado basado en "SSL/TLS" con el objetivo de crear un canal cifrado para la comunicación de los datos más sensibles entre cliente y servidor.
"SSL" permite que el tráfico se envíe de forma segura entre las dos partes sin la posibilidad de que sea interceptado en la red, pero también permite la validación de la identidad del servidor por una autoridad certificadora "CA" que verifica su identidad a través de una firma.
Por lo que cumple dos de los características mas importantes en la seguridad: Autenticación y Confidencialidad.
En este sentido, para crear certificados digitales que son firmados por terceros tenemos 3 opciones:
  • Enviar la solicitud a una autoridad de confianza oficial para que nos firme nuestro certificado como Symantec,... que lógicamente son de pago y bastante caros en su mayoría.
  • Crear nuestro propia autoridad certificadora "CA" y firmar el certificado con esa autoridad creada, lo que implica que tendremos que instalar el certificado de la autoridad de confianza en los diferentes navegadores que utilizemos.
  • Autofirmar nuestro propio certificado al crearlo. Con ello los navegadores advertirán que no pueden verificar la validez del certificado a través de la "CA".
Esta última opción es la que vamos a implementar en nuestra "LAN" doméstica, ya que es la más sencilla de crear y porque nuestro objetivo final es la encriptación de la comunicación, no la validación del certificado a través de un tercero.

Lo primero que debemos hacer es conectarnos a nuestra Raspberry por SSH, RPD,..
Seguidamente abriremos el terminal y habilitaremos el módulo "SSL" en "Apache":

$ sudo a2enmod ssl

Reiniciamos el servicio para que la configuración surta efecto y nuestra Raspberry pueda manejar "SSL":

$ sudo service apache2 restart

Crearemos ahora una carpeta en el directorio de "Apache" para almacenar la clave y el certificado.

$ sudo mkdir /etc/apache2/ssl

Ahora generaremos nuestro certificado y clave utilizando "OpenSSL":

$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/raspberry2.key -out /etc/apache2/ssl/raspberry2.crt

Las opciones utilizadas son:
  • x509: Especifica que queremos hacer un archivo de certificado autofirmado.
  • nodes: nuestro archivo de clave no tendrá "Passphrase", ya que cada vez que reiniciemos "Apache" nos la pediría, por lo que sería bastante molesto. 
  • days: Caducidad en días de nuestro certificado.
  • newkey rsa:2048: Se creará una solicitud de certificado y una clave privada nueva con un cifrado "RSA" de 2048 bits.
  • keyout: Destino del archivo de salida para el archivo de la clave privada.
  • out: Destino del archivo de salida para el certificado.


Rellenamos los datos que nos piden para el certificado según queramos. Es importante que en "Common Name" indiquemos en nombre de nuestro dominio o en su defecto la ip de nuestra Raspberry.














Ya tenemos nuestro certificado autofirmado creado. Ahora nos queda configurar los host virtuales en "Apache" editando el siguiente archivo:

$ sudo nano /etc/apache2/sites-available/default-ssl.conf

Cambiamos o añadimos los siguientes parámetros:

ServerName nuestrodominio o ip de la Raspberry:443
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/raspberry2.crt
SSLCertificateKeyFile /etc/apache2/ssl/raspberry2.key

Como vemos, hemos introducido nuestro dominio o ip como servidor, y hemos activado "SSL" indicando la ruta de la clave y el certificado correspondiente.

A continuación activaremos nuestro nuevo host virtual:

$  sudo a2ensite default-ssl

Reiniciamos el servicio:

$ sudo service apache2 reload

Para probar que todo está configurado correctamente, nos conectaremos en el navegador de cualquier cliente:

https://192.168.0.102/

Nos advertirá que nuestro certificado no está firmado por una entidad autorizada CA.
En la parte inferior pinchamos en "acceder" .


















Ya podremos acceder a la pagina sin problemas y añadirá una excepción para la próxima vez que entremos.
Si pinchamos en la parte donde figura la dirección web, podremos comprobar que nuestra comunicación está cifrada y verificar los parámetros de nuestro certificado.
























Y eso es todo, si tenéis algún problema no dudéis en contactar conmigo.
Hasta otra.....