Conexión segura HTTPS: Uso de Let's Encrypt


Acceso al puerto 443

Para hacer que la conexión al servidor web sea segura, es decir, utilice el protocolo HTTPS en lugar de HTTP, es necesario el uso de un certificado generado por una Entidad Certificadora y habilitar el acceso al puerto 443 desde el exterior. Para que todo funcione correctamente, en primer lugar, hay que crear una nueva redirección de puerto para que al intentar acceder mediante HTTPS desde el exterior,se acceda al servidor. Para ello se redirecciona el puerto 443 del mismo modo que se ha hecho anteriormente para el 80 en el router. Ahora habrá dos reglas de reenvío de puertos en el router, apuntando ambas al servidor web

captura reenvio puerto 443 del router

¿Qué es Let's Encrypt?

Let's Encrypt es una autoridad de certificación que se puso en marcha el 12 de abril de 2016 y que proporciona certificados X.509 gratuitos para el cifrado de Seguridad de nivel de transporte (TLS) a través de un proceso automatizado diseñado para eliminar el complejo proceso actual de creación manual, la validación, firma, instalación y renovación de los certificados de sitios web seguros.

El proyecto tiene como objetivo hacer conexiones cifradas a servidores Web. Al eliminar el pago, la configuración del servidor web, gestión de correo electrónico de validación y las tareas de renovación del certificado, está destinado a reducir significativamente la complejidad de la configuración y el mantenimiento de cifrado TLS. En un servidor web Linux, la ejecución de dos comandos es suficiente para configurar el cifrado HTTPS y adquirir e instalar certificados en el plazo de 20 a 30 segundos.

Pretende ser lo más transparente posible, tanto para proteger su propia integridad como para evitar ataques e intentos de manipulación. Así, se publican regularmente informes de transparencia, se registran todas las transacciones ACME (por ejemplo, mediante el uso de un Certificado de Transparencia), y se usan estándares abiertos y software libre tanto como sea posible.

Let's Encrypt está siendo desarrollado por el Internet Security Research Group. Entre sus patrocinadores están la Electronic Frontier Foundation (EFF), la Fundación Mozilla, OVH, Akamai, y Cisco Systems. Otros colaboradores incluyen la Autoridad de Certificados IdenTrust, la Universidad de Michigan (U-M), la Stanford Law School, la Fundación Linux y Stephen Kent de IBM y Alex Polvi de CoreOS.

Obtención de certificado Let's Encrypt: uso de certbot

Let’s Encrypt utiliza el protocolo ACME (Automatic Certificate Management Environment) , el cual se basa en un proceso en dos pasos, por un lado la validación del dominio y por otro la solicitud del certificado. En la documentación oficial muestra un ejemplo especificando todo el proceso.

Para proceder a la obtención e instalación en el servidor del certificado, se usará el script CERTBOT que ofrece la propia entidad para facilitar el proceso. Cerbot es una herramienta que permite activar automáticamente el certificado ssl a través de Let’s encrypt. La instalación es sencilla y se encuentra explicada en la web de la EFF. En el menú que muestra se selecciona el servidor que se vaya a usar (en este caso Apache) y el sistema operativo (Debian 9 stretch) y automáticamente muestra la explicación del proceso de instalación.

captura certbot

Pasos para la instalación y configuración de Certbot

  1. Actualización del sistema: Al usar Raspbian Stretch el paquete que se utiliza para configurar SSL en la Raspberry Pi está disponible en el repositorio Raspbian Stretch, y como se usa con el servidor Apache, se ejecuta la orden $ sudo apt-get install python-certbot-apache, como se muestra en la captura.

    captura 2 certbot

  2. Obtención Certificado: Con Certbot instalado se puede proceder a obtener un certificado SSL para la Raspberry Pi de Let's Encrypt. Como se está utilizando Apache, la forma más fácil de obtener un certificado es ejecutando el comando $ sudo certbot --apache, que instalará automáticamente el certificado con la configuración de Apache. Antes de hacerlo, primero hay que asegurarse de que el puerto 80 y el puerto 443 se reenvíen correctamente, como se muestra arriba.

    captura 2 certbot

  3. También se puede obtener el certificado de forma manual, obteniendo el script certbot por un lado, hacerlo ejecutable y así poder ejecutarlo para obtener el certificado. Las órdenes son las siguientes: $ sudo wget https://dl.eff.org/certbot-auto, $ sudo chmod a+x certbot-auto y por último $ ./certbot-auto. En las capturas se observa que se han ejecutado las órdenes desde el path /etc/letsencrypt/, pero también se pueden ejecutar desde el home del usuario, tan solo se debe recordar la ubicación de la descarga del script.

    captura 3 certbot

    captura 4 certbot

    captura 5 certbot

    Nota: Como se puede apreciar en las capturas anteriores, se muestran un par de errores que he considerado importante nombrar ya que pone de manifiesto un error muy infantil, fácil de cometer y que puede hacer que se pierda mucho tiempo. En la configuración del servidor web Apache (apartado: instalación de un servidor web con LAMP) y como consejo de seguridad, se habla de anular el archivo de configuración por defecto del servidor web y crear uno nuevo, llamado en este caso raspberryasir.conf. Pues bien, en la edición de ese archivo se muestra el nombre del dominio www.raspberryasir.com (de nuevo a modo de ejemplo), pero la creación real del dominio ha sido www.raspberryasir.es, y de ahí el error que muestra el script certbot cuando trata de crear el certificado, ya que lo primero que compueba son las dns del dominio en cuestión. Una vez subsanado el error en el archivo de configuración se puede observar que el certificado se crea sin problemas, tan sólo se debe constestar si se desea que se reenvien las peticiones http a https para evitar que se dupliquen, a lo que se contesta que SI, y lo hace el script automáticamente.

    captura 6 certbot

    captura 7 certbot

  4. Renovación automática: Sólo falta por configurar la renovación automática del certificado, ya que su validez es de 3 meses. Para ello lo que se hace es introducir en el cron una tarea que trate de renovar el certificado dos veces por día, según recomendación oficial. También indican en la web, en las recomendaciones para la versión debian Stretch, que "Los paquetes de Certbot instalados en el sistema vienen con un trabajo cron que renovará los certificados automáticamente antes de que caduquen. Como los certificados Let's Encrypt duran 90 días, es muy recomendable aprovechar esta característica." Para probar la renovación automática se ejecuta el siguiente comando, con el parámetro “dry-run”, que simula la renovación: $ sudo certbot renew --dry-run.

    captura renovación certbot

    Como se observa en la captura anterior, se detectan errores al ejecutar el script como aconseja la web de certbot en la versión debian stretch, por tanto he decidido a partir de aquí usar el script de forma manual que funciona para todas las versiones de debian, incluido raspbian, ejecutando el siguiente comando $ ./certbot-auto renew --dry-run.

    captura renovación manual certbot

    Lo siguiente es probar el comando, pero añadiéndole un "post hook", que permite ejecutar un comando por shell tras el intento de renovación del certificado. Esto se hace para que Apache cargue los nuevos certificados, ya que podría pasar que los tuviera renovados y que, al no recargar la configuración, siguiera usando los antiguos y estos caducaran. Más información aquí

    captura renovación manual certbot 2

Por último, si la simulación ha sido correcta, se añade dicho proceso de renovación a crontab para que se ejecute automáticamente cuando la licencia vaya a expirar,hay que seguir los siguientes pasos:

  1. Editar el archivo crontab ejecutando el comando $ sudo crontab -e

    captura editando crontab

  2. Agregar una secuencia de comandos en la parte inferior del archivo crontab que se ejecutará dos veces al día y renovará automáticamente los certificados SSL si están a punto de caducar. En este caso se comprobará todos los días a las 14:30h. y a las 2:30h.

    captura editando crontab

Se puede usar un Comprobador SSL ssl checker para verificar si los certificados se han renovado con éxito.

captura comprobación renovación certificado

Ajustes adicionales

Para dejarlo completamente configurado de manera que, se indiquen o no las www al inicio de la dirección, la dirección mostrada sea siempre la completa, hay que hacer un último ajuste en el fichero raspberryasir.conf de Apache, añadiendo ciertas líneas a la redirección ya realizada por la ejecución de CERTBOT en la configuración del VirtualHost.

captura editando raspberryasir.conf

captura 2 editando raspberryasir.conf


Esta página forma parte del proyecto Mini servidor para prácticas ASIR por Nacho López, que se distribuye bajo una Licencia Creative Commons Reconocimiento-CompartirIgual 4.0 Internacional (CC BY-SA 4.0).