Desplegar una aplicación ASP.NET Core HTTPS con un certificado SSL puede parecer trivial a primera vista, especialmente con servicios como Let's Encrypt que hacen que los certificados sean gratuitos y accesibles. En la práctica, sin embargo, puede complicarse rápidamente, especialmente cuando se combina este proceso con el despliegue de aplicaciones modernas en entornos de contenedores.
La configuración de certificados SSL requiere una serie de operaciones: hay que saber montar correctamente los archivos de certificado en un contenedor DOCKER para que la aplicación pueda acceder a ellos, gestionar formatos de archivo como PEM o RSA para garantizar su compatibilidad con Kestrel (el servidor web integrado de ASP .NET Core) y configurar adecuadamente las variables de entorno para que la aplicación pueda utilizarlos correctamente. Cada uno de estos pasos, si no se realiza con cuidado, puede introducir errores o complicaciones.
En este artículo, nos centraremos únicamente en el proceso de configuración de una aplicación ASP.NET Core para HTTPS con un certificado SSL autogenerado por Let's Encrypt. Veremos cómo instalar Certbot, generar el certificado SSL, configurar Kestrel para HTTPS y desplegar la aplicación en un contenedor Docker. Para seguir esta guía, necesitarás un servidor Linux con Docker ya instalado y configurado, y tendrás que dominar los comandos básicos para crear y gestionar imágenes. Siguiendo estos pasos, podrás configurar fácilmente tus aplicaciones utilizando el protocolo HTTPS.
Paso 1 - Instalar Certbot en un servidor Linux.
El primer paso para obtener un certificado SSL gratuito de Let's Encrypt es instalar Certbot en su servidor Linux. CertBot es una herramienta de línea de comandos que facilita la solicitud de certificados SSL/TLS.
- Actualice el servidor e instale Certbot.
# Para Ubuntu/Debian
sudo apt update
sudo apt install certbot-y
Paso 2 - Generar el certificado SSL con Let's Encrypt (CertBot).
Para obtener un certificado SSL con Let's Encrypt usando el desafío DNS-01, debes demostrar la propiedad de tu dominio creando un registro DNS TXT específico. He aquí cómo hacerlo:
- Generar un certificado SSL con el desafío DNS-01:
sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d tu-dominio.com --key-type rsa
Este comando utiliza certonly
para simplemente obtener el certificado sin configurar automáticamente un servidor web, dándonos control total sobre su uso, especialmente para despliegues personalizados como Docker.
La opción --Manual
se elige para validar el certificado a través de un desafío DNS gestionado manualmente, útil cuando el proveedor DNS no soporta la automatización, y --Manual-auth-hook
especifica el script que ayuda a automatizar la creación del registro DNS necesario.
Por último, el uso de --preferred-challenges dns
indica que se prefiere la impugnación DNS-01, ya que es más flexible en muchos entornos.
Una vez ejecutado este comando, Certbot te pedirá que crees un registro DNS específico para validar la propiedad del dominio. Siga las instrucciones proporcionadas.
- Siga las instrucciones de Certbot para el desafío DNS:
Después de ejecutar el comando de Certbot, Certbot le pedirá que cree un registro DNS TXT para validar la propiedad de su dominio. Deberías obtener una salida similar a esta:
Please deploy a DNS TXT record under the name
_acme-challenge.tu-dominio.com with the following value:
ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789
- Añadir el registro DNS TXT.
Dirígete a la sección de gestión de DNS de tu proveedor de dominio y crea un nuevo registro TXT con los datos proporcionados por Certbot.
Type : TXT
Nombre : _acme-challenge.dev
Valor : ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789
- Validar el desafío DNS con Certbot.
Vuelva al terminal donde lanzó Certbot y pulse Intro para continuar. Let's Encrypt comprobará el registro DNS y, si está correctamente configurado, emitirá el certificado SSL.
💡Por defecto, los certificados se encuentran aquí: /etc/letssencrypt/live/.
Paso 3- Verificar y convertir la clave privada.
Una vez generados el certificado y la clave privada, es importante comprobar que los ficheros en formato PEM están correctamente formateados y listos para su uso con Kestrel.
- Verificar la clave privada generada por Certbot:
sudo openssl rsa -in /etc/letsencrypt/live/tu-dominio.com/privkey.pem -check
- Convierte la clave privada a otro formato si es necesario:.
Por defecto, las claves generadas por Let's Encrypt con Certbot están en formato RSA, tal y como especificamos en el paso 1. Sin embargo, si ha especificado otro formato o ha utilizado otra herramienta para generar la clave, puede convertirla al formato RSA esperado por Kestrel con el siguiente comando:
sudo openssl rsa -in /etc/letsencrypt/live/tu-dominio.com/privkey.pem -out /etc/letsencrypt/live/tu-dominio.com/privkey-rsa.pem
Esta conversión asegura que la clave está en el formato esperado por Kestrel en la aplicación ASP.NET CORE.
Paso 4- Ejecutar el contenedor Docker con los ficheros PEM.
Cuando despliegue su aplicación en un contenedor Docker, deberá montar los archivos PEM de certificado y clave privada para que Kestrel pueda acceder a ellos.
Utilice el siguiente comando para ejecutar el contenedor Docker en su servidor:
sudo docker run -it -p 443:81 -p 80:80 \
-e ASPNETCORE_URLS="https://*:81;http://*:80" \
-v /etc/letsencrypt:/cert \
-e ASPNETCORE_Kestrel__Certificates__Default__Path=/cert/live/tu-dominio.com/fullchain.pem \
-e ASPNETCORE_Kestrel__Certificates__Default__KeyPath=/cert/live/tu-dominio.com/privkey.pem \
-e mi-docker-repositorio/mi-imagen-docker:latest
Este comando monta la carpeta que contiene los archivos PEM (clave privada y certificado) en el contenedor Docker ( -v /etc/letsencrypt:/cert), permitiendo a la aplicación acceder a ellos.
Las variables de entorno especifican las rutas a los archivos PEM en el contenedor para que Kestrel los utilice al iniciarse, garantizando conexiones HTTPS seguras.
Paso 5 - Ejecutar el contenedor Docker con los archivos PEM.
Una vez que hayas seguido todos los pasos, es hora de probar tu aplicación para asegurarte de que todo funciona correctamente. Vaya a la dirección https://tu-dominio.com en su navegador web. Si el certificado SSL se ha instalado y configurado correctamente, debería ver una conexión segura con el icono del candado en la barra de direcciones. Esto indica que el tráfico entre su servidor y el cliente está ahora cifrado y seguro.
Si todo está configurado correctamente, su aplicación ASP.NET se ha implementado con éxito en un entorno seguro utilizando Docker y un certificado SSL Let's Encrypt.
Con este enfoque, puede proteger fácilmente el despliegue en producción de sus aplicaciones .NET al tiempo que aprovecha la flexibilidad y eficacia de Docker, que permite el despliegue portátil en cualquier entorno.
Quentin Destrade