MQTT en producción: pruebas detrás de un broker con 5 protocolos y mTLS
Volver al blog

MQTT en producción: pruebas detrás de un broker con 5 protocolos y mTLS

Agosto 2026 — Agosto 2026 24 vistas

Artículo técnico · Gilberto Castillo · broker.gilman.pro · 2026

MQTT (Message Queuing Telemetry Transport) es el protocolo estándar de IoT: liviano, publish/subscribe, pensado para sensores y dispositivos con recursos limitados. En este artículo te explico la técnica detrás del broker que construí y desplegué en producción: cómo funciona, los 5 protocolos de conexión, la seguridad aplicada y cómo puedes probarlo — empezando por el tester web, porque lo mejor de un sistema es poder tocarlo.


🧪 Pruébalo primero: el Test-Broker

Antes de hablar de puertos y certificados, lo primero que necesitas saber es que puedes probar este broker sin instalar absolutamente nada, desde el navegador.

El Test-Broker (test-broker.gilman.pro) es un tester web de MQTT que construí como proyecto complementario. Técnicamente funciona así:

  • El navegador no habla MQTT nativo, así que el backend (FastAPI) abre un puente WebSocket → MQTT: el JavaScript envía el mensaje por WebSocket, el servidor lo traduce a MQTT (con paho-mqtt v2, soportando MQTT v5 y v3.1.1) y lo entrega al broker.
  • Soporta los 5 protocolos del broker: TCP, TLS, mTLS, WebSocket y WSS — con selector de protocolo y versión por cliente, e incluso certificados.
  • Los usuarios temporales son autogestionados: cualquiera solicita credenciales en /solicitar con su correo, el sistema las genera (validez 24 h, límites de clientes y conexiones controlados) y las envía por SMTP. Protegido contra abuso con rate limiting anti-spam (3 solicitudes/h por IP, 1/día por correo) y honeypots.

Para probar el broker desde el navegador:

  1. Entra a https://test-broker.gilman.pro/solicitar y pide un usuario temporal (llega a tu correo)
  2. Inicia sesión y crea un cliente MQTT hacia broker.gilman.pro — puerto 14769 (TCP), usuario/contraseña recibidos
  3. Publica y suscríbete en tiempo real — mensajes al instante, colores por tópico, filtros y auto-scroll

¿Prefieres scripts y terminal? También hay un kit descargable (.rar) con scripts de validación, certificados mTLS, instalador de Mosquitto y guía paso a paso — todo listo para ejecutar:

⬇️ Descargar kit de pruebas


⚙️ La arquitectura

El broker corre en un VPS con Docker Compose (3 servicios) detrás de nginx como punto único de entrada con TLS:

Dispositivos IoT ── TCP / TLS / mTLS ──► Mosquitto (broker MQTT)
Navegador Web ──── HTTPS/WSS ─────────► nginx ──► Dashboard FastAPI
                                        └──────► Mosquitto (WSS)
Capa Tecnología Rol
Broker Eclipse Mosquitto 2.0.12 Enrutamiento publish/subscribe
Dashboard Python FastAPI + Uvicorn Panel de administración, API REST, WebSocket de monitoreo
Base de datos SQLite Usuarios, configuración, logs (ligera, sin dependencias)
TLS nginx Terminación SSL, proxy de WSS y HTTPS
Orquestación Docker Compose 3 servicios con watcher de recuperación automática

El dashboard no solo administra: monitorea en tiempo real (clientes conectados, tráfico, tópicos) vía WebSocket, y un watcher supervisa y recupera servicios automáticamente.


🔌 Los 5 protocolos de conexión, explicados

Un detalle técnico que marca la diferencia: el broker expone 5 métodos de conexión en puertos dedicados, todos gestionables desde el panel (se activan/desactivan en vivo y la configuración de Mosquitto se regenera sola).

Protocolo Puerto ¿Qué es? ¿Cuándo usarlo?
TCP 14769 MQTT puro sobre TCP La base: ESP32, Raspberry Pi, sensores
WebSocket 14770 MQTT sobre WebSocket Navegadores y apps web
TLS 14771 MQTT cifrado con certificado de servidor Cuando el canal debe ir cifrado
mTLS 14772 Autenticación mutua con certificado de cliente Máxima seguridad, identidad verificable
WSS 443 WebSocket seguro vía nginx Producción para apps web

TCP — la conexión estándar

MQTT sobre TCP es el modo más directo: el dispositivo abre el socket, autentica con usuario/contraseña y publica/suscribe por tópicos jerárquicos (casa/sala/temperatura), con comodines + (un nivel) y # (todos).

mosquitto_pub -h broker.gilman.pro -p 14769 \
  -u "sensor-temperatura" -P "claveSegura123" \
  -t "casa/sala/temperatura" -m "25.5" -q 1

WebSocket — MQTT para el navegador

Los navegadores no pueden abrir sockets MQTT nativos, pero sí WebSocket. El puerto 14770 expone MQTT directamente sobre WebSocket — ideal para dashboards React/Vue/Angular con Paho MQTT:

const client = new Paho.MQTT.Client("broker.gilman.pro", 14770, "web_client_1");
client.connect({
    userName: "sensor-temperatura",
    password: "claveSegura123",
    onSuccess: () => { client.subscribe("casa/+/temperatura"); }
});

TLS — el canal cifrado

En 14771, la conexión va cifrada con el certificado del servidor firmado por la CA interna. El cliente debe confiar en la CA del broker (--cafile ca.crt):

mosquitto_pub -h broker.gilman.pro -p 14771 \
  --cafile ca.crt -u "sensor-temperatura" -P "claveSegura123" \
  -t "casa/sala/temperatura" -m "25.5" --tls-version tlsv1.2

mTLS — identidad verificable por dispositivo

Aquí está el salto de seguridad: autenticación mutua. No basta con saber la contraseña — el dispositivo presenta un certificado firmado por la CA interna y el broker lo valida en el handshake. Un cliente sin certificado es rechazado antes de poder hablar (lo verifiqué en pruebas: la intrusión mTLS queda bloqueada con error de TLS).

mosquitto_pub -h broker.gilman.pro -p 14772 \
  --cafile ca.crt --cert sensor_temp.crt --key sensor_temp.key \
  -t "casa/sala/temperatura" -m "25.5"

Cada dispositivo puede tener su propio certificado, emitido y revocado desde el panel — revocar el acceso de un dispositivo toma segundos.

WSS — WebSocket seguro para producción

wss://broker.gilman.pro/mqtt es el WebSocket cifrado terminado en nginx (Let’s Encrypt), el canal que usan las apps web en producción. Detalle técnico: el handshake requiere HTTP/1.1 (con HTTP/2 el servidor responde 502).


🛡️ Seguridad: capas, no candados sueltos

La seguridad está en capas, cada una verificable:

  • Web (dashboard): JWT con cookies HttpOnly + Secure + SameSite, roles granulares (admin, editor, lector) con permisos heredados, rate limiting por IP contra fuerza bruta (HTTP 429 con cooldown, confirmado en prueba), CORS restrictivo y headers de seguridad completos (CSP, HSTS, X-Frame-Options…).
  • MQTT: usuario/contraseña en todos los puertos (el acceso anónimo está desactivado — lo verifiqué: CONNACK rechaza), y mTLS con certificados por dispositivo para el acceso crítico.
  • TLS: 1.2 y 1.3 en el panel (Let’s Encrypt) y cifrado en todos los protocolos expuestos.

Resultados del pentest automatizado (2026-08-12): TLS + HSTS ✅ · SQLi/XSS bloqueados ✅ · anti-enumeración de usuarios ✅ · API protegida (401/404) ✅ · sin archivos sensibles expuestos ✅ · 0 vulnerabilidades críticas. Auditoría web/API: 19/21 (90%) — los 2 casos restantes son credenciales de prueba rotadas (medida de seguridad) y el rate limit de la propia prueba.


✅ Validación: 16/16 pruebas superadas

La infraestructura MQTT se validó contra el broker en producción con un validador automatizado:

Prueba Resultado
Conexión TCP · WebSocket · WSS · TLS · mTLS ✅ 5/5
Comunicación cruzada (10 combinaciones entre protocolos) ✅ 10/10
Intrusión mTLS (cliente sin certificado) ✅ Bloqueado
Total 16/16 PASS

Además, con los clientes oficiales mosquitto_pub/mosquitto_sub se hizo PUB/SUB de ida y vuelta en los 4 protocolos (TCP, TLS, mTLS, WSS): 4/4 PASS.


💻 Código por lenguaje

Lenguaje Librería Puerto Ejemplo mínimo
CLI mosquitto_pub 14769 mosquitto_pub -h broker.gilman.pro -p 14769 -u user -P pass -t test -m "hola"
Python paho-mqtt 14769 c=mqtt.Client(); c.username_pw_set('u','p'); c.connect('broker.gilman.pro',14769)
Node.js mqtt.js 14769 mqtt.connect('mqtt://broker.gilman.pro:14769',{username:'u',password:'p'})
ESP32 PubSubClient 14769 client.setServer("broker.gilman.pro",14769)
Navegador Paho MQTT 14770 new Paho.MQTT.Client("broker.gilman.pro",14770,"id")
WSS paho-mqtt 443 wss://broker.gilman.pro/mqtt

Tópicos recomendados: jerarquías por dominio, p. ej. casa/{habitacion}/{sensor} → casa/sala/temperatura, fabrica/{maquina}/{medicion}, vehiculo/{id}/{sensor}.


📦 Kit de pruebas descargable

Todo lo de este artículo en un solo archivo: scripts de validación (publicador_password.py, publicador_certificado.py, suscriptor_certificado.py, test_wss.py, validador_completo.py), certificados mTLS, instalador de Mosquitto para Windows y guía paso a paso en Markdown y PDF:

⬇️ Descargar kit-pruebas-mqtt.rar

cd broker
python3 publicador_password.py     # TCP (14769)
python3 publicador_certificado.py  # mTLS (14772)
python3 validador_completo.py      # 16/16 pruebas

🎓 Conclusión

Construir un broker MQTT en producción va mucho más allá de levantar Mosquitto: es diseñar 5 caminos de conexión con su autenticación correcta, cifrar todo lo que se mueve, administrar identidades con certificados por dispositivo, monitorear en vivo y demostrar con pruebas que cada capa funciona — incluyendo que el intruso sin certificado no entra.

Y lo mejor de todo: puedes comprobarlo tú mismo. Prueba el Test-Broker con un usuario temporal, o descarga el kit y ejecuta la validación completa: Total: 16/16 pruebas superadas.


Recursos: Proyecto Broker MQTT · Proyecto Test MQTT · Kit de pruebas · Test-Broker (web)

Volver al blog