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".
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:
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.....
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 |
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.....