Serie
- Gestión de certificados (PKI) – easy-rsa
- MQTT Broker (Mosquitto) con certificado servidor (self-signed)
- MQTT Broker (Mosquitto) con certificado servidor (self-signed) y certificado en los clientes
- MQTT Broker (Mosquitto) con certificado servidor (Let’s Encrypt)
- Formatos de Certificados: PEM, DER y PKCS#12 y Manipulación de Claves Privadas
Introducción
En este post presentamos un proof-of-concept para configurar un broker MQTT utilizando Mosquitto, en el que se implementa TLS gracias a los certificados de Let’s Encrypt. Este método aporta varias ventajas frente a las soluciones tradicionales:
- No requiere exposición pública: El servidor no tiene que estar expuesto a Internet; únicamente el nombre de dominio debe resolverse correctamente en DNS, lo que minimiza la superficie de ataque.
- Facilidad de uso: Con Certbot y herramientas automatizadas (como Just), se simplifica el proceso de emisión y renovación de certificados.
- Rentable: Let’s Encrypt ofrece certificados gratuitos, reduciendo costes operativos.
Esta aproximación es ideal para entornos privados, de desarrollo o pruebas de concepto, donde se desea un equilibrio entre seguridad y comodidad.
Demostración en vídeo
Requisitos
- Nombre de dominio: Un dominio válido (por ejemplo,
mqtt.example.com
). - Certbot: Herramienta para obtener certificados de Let’s Encrypt.
- Just: Un command runner que simplifica la ejecución de tareas (consulta el Justfile para ver los comandos disponibles).
- Mosquitto: El software del broker MQTT.
Configuración
Obtención de Certificados con Certbot
Let’s Encrypt permite obtener certificados TLS gratuitos y automatizados. Ten en cuenta que, a diferencia de otras implementaciones, Let’s Encrypt no soporta certificados para clientes, por lo que solo se generará el certificado para el servidor.
Existen dos métodos habituales para validar la propiedad del dominio:
- HTTP-01 Challenge: Requiere disponer de un servidor web en funcionamiento.
- DNS-01 Challenge: Consiste en añadir un registro TXT en el DNS, ideal si no dispones de una IP pública o de un servidor web.
Importante: Asegúrate de que el nombre distinguido (DN) del certificado coincide exactamente con el hostname que usarán los clientes para conectarse y que este se resuelve correctamente en DNS.
Instalación
Para comenzar, crea un entorno virtual e instala Certbot:
uv venv
uv pip install certbot
Solicitud del Certificado
Emplea la siguiente sintaxis para solicitar el certificado:
just certbot certonly -m <tu-email> --preferred-challenges dns-01 --manual -d <dominio1>,<dominio2>,...
Por ejemplo:
just certbot certonly -m oriol@joor.net --preferred-challenges dns-01 --manual -d mqtt.joor.net,pki.joor.net
Si la solicitud es exitosa, los certificados se ubicarán en la ruta:
certbot/config/live/<dominio>
Dentro de este directorio encontrarás:
privkey.pem
: Tu clave privada.fullchain.pem
: La cadena completa de certificados, que es la que se utiliza en la mayoría de las configuraciones de servidor.chain.pem
: Certificados intermedios (útiles, por ejemplo, para OCSP stapling en Nginx >=1.3.7).cert.pem
: Un certificado que puede generar conflictos en algunos escenarios, por lo que generalmente se recomienda utilizarfullchain.pem
.
Para Mosquitto, solo se requerirán los archivos fullchain.pem
y privkey.pem
.
Ejecución del Broker MQTT
La configuración de Mosquitto ya está preparada para referenciar los certificados emitidos por Let’s Encrypt. Para lanzar el servicio, ejecuta:
just mqtt
Este comando inicia Mosquitto utilizando el archivo de configuración mosquitto.conf
, el cual contiene las rutas correctas a los certificados.
Detalles del Certificado
- Clave Privada (
privkey.pem
): Garantiza la identidad segura del servidor. - Cadena Completa (
fullchain.pem
): Incluye tanto el certificado del servidor como los certificados intermedios necesarios.
Dado que los clientes suelen confiar en las CA de Let’s Encrypt incluidas en sus sistemas operativos, no es necesario proporcionar un certificado CA adicional en el broker.
Renovación del Certificado
Los certificados de Let’s Encrypt tienen una vigencia de 90 días, por lo que es imprescindible renovarlos periódicamente para mantener la seguridad. Para renovar los certificados, puedes usar:
just certbot renew
# o alternativamente:
just certbot_renew
Tras la renovación, si las rutas en el archivo de configuración de Mosquitto permanecen iguales, el broker utilizará automáticamente el nuevo certificado al reiniciarse o al hacer un reload de la configuración.
Notas
- Esta configuración es una prueba de concepto. Para entornos de producción, considera automatizar completamente el proceso de renovación y revisar otras medidas de seguridad adicionales.
- Asegúrate de actualizar los registros DNS para que la validación del dominio se realice sin problemas.
- Modifica los archivos de configuración únicamente si comprendes las implicaciones de seguridad asociadas.
Referencias
- Repositorio: github.com/mqtt-server-certbot
- Repositorio: github.com/mqtt-server-n-client-n-server-private-pki
- Repositorio: github.com/mqtt-server-private-pki
- https://mqttx.app/
- https://mqttx.app/docs/cli
- Creating and Using Client Certificates with MQTT and Mosquitto
- Using A Lets Encrypt Certificate on Mosquitto
- SSL and SSL Certificates Explained For Beginners
- Mosquitto.conf man
- How to Configure MQTT over WebSockets with Mosquitto Broker
- Getting the Client’s Real IP When Using the NGINX Reverse Proxy for EMQX