Configurar TLS para MQTT en Node-RED lleva pocos minutos, pero un par de campos fáciles de pasar por alto deciden si tu conexión es realmente segura o simplemente está cifrada. Este tutorial configura el nodo de configuración mqtt-broker para el puerto 8883 con verificación de certificado, credenciales y MQTT 5, te ofrece un flujo importable y explica los errores que podrías encontrarte por el camino.
Cómo funciona TLS en Node-RED
Los nodos MQTT de Node-RED se basan en MQTT.js y en la pila TLS de Node.js. Intervienen tres piezas:
- Nodo de configuración mqtt-broker: contiene el servidor, el puerto, el client ID, la versión del protocolo, las credenciales y una casilla "Use TLS".
- Nodo tls-config: un nodo de configuración independiente que guarda las opciones TLS, como el certificado de la CA, el certificado de cliente, el nombre del servidor y si se debe verificar el certificado del servidor.
- Nodos mqtt in / mqtt out: hacen referencia al nodo broker; no tienen ajustes TLS propios.
Cuando el broker usa un certificado de una CA de confianza pública, Node.js ya confía en él a través de la lista de raíces de Mozilla que incluye. El broker de ConnectMQ usa un certificado de Let's Encrypt, así que no necesitas subir ningún archivo de CA; solo tienes que activar TLS y mantener la verificación activada.
Si todavía no tienes Node-RED instalado, sigue primero nuestra guía para instalar Node-RED.
Opciones de puerto y protocolo
| Opción | Campo Server | Puerto | Cuándo usarla |
|---|---|---|---|
| MQTT sobre TLS | broker.connectmq.com |
8883 | Opción predeterminada para Node-RED en servidores, PC y gateways |
| WebSocket seguro | wss://broker.connectmq.com:8084/mqtt |
8084 | Redes que bloquean el 8883 pero permiten tráfico de tipo HTTPS |
| MQTT sin cifrar | broker.connectmq.com |
1883 | Solo para pruebas locales en el broker público |
Configuración paso a paso de Node-RED MQTT TLS
Paso 1: crea el nodo broker
Arrastra un nodo mqtt in al área de trabajo y haz doble clic en él. Junto a Server, elige Add new mqtt-broker y haz clic en el icono del lápiz.
En la pestaña Connection:
- Server:
broker.connectmq.com - Port:
8883 - Connect automatically: marcado
- Use TLS: marcado
- Protocol: MQTT V5 (o V3.1.1 si tus otros clientes lo necesitan)
- Client ID: el client ID generado en el portal del broker (
YOUR_CLIENT_ID). Nunca lo dejes vacío en un broker privado ni lo reutilices en otro cliente, o las dos conexiones se desconectarán mutuamente una y otra vez. - Keep Alive: 60 segundos es un valor predeterminado razonable.
Paso 2: añade la configuración TLS
Al marcar Use TLS, aparece un campo TLS Configuration. Elige Add new tls-config y haz clic en el icono del lápiz:
- Certificate / Private Key: déjalos vacíos. Sirven para la autenticación con certificado de cliente (TLS mutuo), que ConnectMQ no utiliza; ConnectMQ autentica con usuario y contraseña sobre TLS.
- CA Certificate: déjalo vacío para brokers de confianza pública. Sube tu archivo de CA solo para un broker privado con su propia CA.
- Verify server certificate: marcado. Es la casilla más importante de la página.
- Server Name:
broker.connectmq.com. Node.js normalmente deduce el SNI del campo del servidor, pero indicarlo explícitamente evita sorpresas. - Name: una etiqueta descriptiva como
Cloud broker TLS, para que puedas reutilizar el nodo en otras configuraciones de broker.
Haz clic en Add para volver al nodo broker.
Paso 3: introduce las credenciales
En la pestaña Security del nodo broker, introduce el Username y la Password del portal. Node-RED las guarda en flows_cred.json, separadas del flujo, y nunca se incluyen al exportar flujos. Define credentialSecret en settings.js para que este archivo se cifre con una clave que tú controlas en lugar de una generada automáticamente; de lo contrario, al mover el proyecto a otra máquina puedes acabar con credenciales ilegibles.
Paso 4: ajustes opcionales de MQTT 5
Con MQTT V5 seleccionado aparecen opciones adicionales:
- Session Expiry en el nodo broker: cuánto tiempo conserva el broker tus suscripciones y los mensajes QoS 1/2 en cola tras una desconexión. Combinado con un client ID fijo y clean start desactivado, permite que una instancia de Node-RED reiniciada recupere los mensajes que se perdió.
- Pestaña Messages: mensajes de nacimiento (birth), cierre (close) y última voluntad (will). Un mensaje de nacimiento retenido como
{"status":"online"}y un mensaje will{"status":"offline"}en un topic de estado te dan un indicador de salud sencillo. - Opciones de mqtt in: gestión de retenidos (retain handling), "no local" (no recibir tus propias publicaciones) y "retain as published".
- Opciones de mqtt out: caducidad del mensaje, content type, response topic, correlation data y user properties.
Nuestra visión general de las funciones de MQTT 5 explica cada una de ellas con más detalle.
Paso 5: despliega y verifica
Apunta el nodo mqtt in a un topic como factory/line1/#, conéctalo a un nodo debug y haz clic en Deploy. En pocos segundos el estado del nodo debería cambiar a "connected" en verde. Si se queda indefinidamente en "connecting" o muestra "disconnected", salta a la sección de solución de problemas más abajo.
Flujo de ejemplo importable
Importa este flujo (menú, Import, pegar) para obtener una configuración TLS completa en un solo paso. Usa el servidor MQTT público gratuito sobre TLS con acceso anónimo, así que funciona de inmediato. Sustituye 8b2f por tus propios caracteres aleatorios; para un broker privado, cambia el client ID y añade las credenciales en la pestaña Security.
[
{
"id": "f1e2d3c4b5a69701",
"type": "tls-config",
"name": "ConnectMQ TLS",
"cert": "",
"key": "",
"ca": "",
"certname": "",
"keyname": "",
"caname": "",
"servername": "broker.connectmq.com",
"verifyservercert": true,
"alpnprotocol": ""
},
{
"id": "f1e2d3c4b5a69702",
"type": "mqtt-broker",
"name": "ConnectMQ over TLS",
"broker": "broker.connectmq.com",
"port": "8883",
"tls": "f1e2d3c4b5a69701",
"clientid": "nodered-tls-8b2f",
"autoConnect": true,
"usetls": true,
"protocolVersion": "5",
"keepalive": "60",
"cleansession": true,
"autoUnsubscribe": true,
"sessionExpiry": "",
"birthTopic": "connectmq/demo/8b2f/nodered/status",
"birthQos": "1",
"birthRetain": "true",
"birthPayload": "{\"status\":\"online\"}",
"willTopic": "connectmq/demo/8b2f/nodered/status",
"willQos": "1",
"willRetain": "true",
"willPayload": "{\"status\":\"offline\"}"
},
{
"id": "f1e2d3c4b5a69703",
"type": "inject",
"name": "Every 10 s",
"props": [{ "p": "payload" }],
"repeat": "10",
"once": true,
"onceDelay": "2",
"topic": "",
"payload": "",
"payloadType": "date",
"x": 140,
"y": 80,
"wires": [["f1e2d3c4b5a69704"]]
},
{
"id": "f1e2d3c4b5a69704",
"type": "change",
"name": "Build reading",
"rules": [
{ "t": "set", "p": "payload", "pt": "msg", "to": "{\"ts\": payload, \"value\": $round($random() * 100, 1)}", "tot": "jsonata" },
{ "t": "set", "p": "topic", "pt": "msg", "to": "connectmq/demo/8b2f/nodered/reading", "tot": "str" }
],
"x": 330,
"y": 80,
"wires": [["f1e2d3c4b5a69705"]]
},
{
"id": "f1e2d3c4b5a69705",
"type": "mqtt out",
"name": "Publish over TLS",
"topic": "",
"qos": "1",
"retain": "false",
"broker": "f1e2d3c4b5a69702",
"x": 540,
"y": 80,
"wires": []
},
{
"id": "f1e2d3c4b5a69706",
"type": "mqtt in",
"name": "Subscribe over TLS",
"topic": "connectmq/demo/8b2f/nodered/#",
"qos": "1",
"datatype": "auto-detect",
"broker": "f1e2d3c4b5a69702",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 160,
"y": 160,
"wires": [["f1e2d3c4b5a69707"]]
},
{
"id": "f1e2d3c4b5a69707",
"type": "debug",
"name": "Show",
"active": true,
"tosidebar": true,
"console": false,
"complete": "true",
"targetType": "full",
"x": 370,
"y": 160,
"wires": []
}
]
Tras desplegarlo, la barra lateral de depuración muestra el estado "online" retenido y una nueva lectura cada diez segundos, todo viajando sobre TLS. El área pública es visible para todo el mundo, así que úsala solo para datos de prueba.
Usar WebSocket seguro en su lugar
Si tu red bloquea el puerto 8883, escribe una URL completa en el campo Server: wss://broker.connectmq.com:8084/mqtt. Node-RED ignora entonces el campo del puerto y se conecta mediante WebSocket seguro en el 8084, con TLS gestionado por la misma verificación de certificado. Es habitual en redes corporativas; consulta MQTT sobre WebSocket para más contexto.
Solución de problemas de Node-RED MQTT TLS
- Se queda en "connecting": probablemente el puerto 8883 está bloqueado. Prueba desde el host de Node-RED con
openssl s_client -connect broker.connectmq.com:8883 -servername broker.connectmq.come intenta WSS en el 8084. - "unable to get local issuer certificate" en el log: Node.js no puede construir la cadena. Suele deberse a la inspección TLS en la red o a un archivo de CA subido que reemplazó los valores predeterminados con la raíz equivocada. Elimina el archivo de CA en brokers de confianza pública.
- "Hostname/IP does not match certificate's altnames": has introducido una dirección IP o un alias. Usa el nombre de host.
- "Connection refused: Not authorized" o un reason code tras conectar: TLS funciona; las credenciales o el client ID son incorrectos. Vuelve a copiarlos del portal.
- Se conecta y se desconecta cada pocos segundos: otro cliente usa el mismo client ID, a menudo una segunda instancia de Node-RED o un script de prueba olvidado.
- "Use TLS" desmarcado con el puerto 8883: la conexión se cuelga o se cae porque el broker espera un handshake TLS en el 8883, así que "Use TLS" debe estar marcado.
La guía Node-RED MQTT no conecta y el artículo sobre cómo solucionar fallos del handshake TLS de MQTT cubren más casos. Nunca desmarques Verify server certificate para que desaparezca un error; eso oculta la causa real y elimina la protección frente a brokers impostores.
Refuerza el resto de tu instalación de Node-RED
Una conexión cifrada con el broker es solo una capa. Protege también el editor con adminAuth, sírvelo por HTTPS, mantén Node-RED y sus nodos actualizados y define credentialSecret. Nuestra guía para asegurar Node-RED cubre cada paso, y el tutorial de Node-RED MQTT muestra cómo estructurar topics y payloads para flujos más grandes.
Ejecuta tus flujos de Node-RED en ConnectMQ
Node-RED es un cliente MQTT, así que necesita un broker fiable al otro lado. Un broker MQTT gestionado como ConnectMQ te ofrece TLS en el 8883, WebSocket seguro en el 8084, un certificado que se renueva automáticamente y un portal con un explorador de topics en directo y un panel para comprobar lo que publican tus flujos. Regístrate en app.connectmq.com, elige el plan Serverless gratuito sin tarjeta de crédito, crea un broker y pega el usuario, la contraseña y el client ID generados en el nodo broker. Si antes quieres comparar modelos de alojamiento, lee nuestra guía de broker MQTT en la nube.
Preguntas frecuentes
¿Necesito subir un certificado de CA en Node-RED para ConnectMQ?
No. Su certificado lo emite Let's Encrypt, en el que Node.js ya confía. Activa TLS, mantén marcado "Verify server certificate" y deja vacío el campo de la CA.
¿Se incluyen mis credenciales MQTT al exportar un flujo?
No. Node-RED guarda las credenciales por separado en flows_cred.json y las excluye de las exportaciones, así que debes volver a introducirlas tras importar el flujo en otra instancia.
¿Pueden varias instancias de Node-RED compartir una misma configuración de broker?
Pueden compartir los mismos ajustes, pero cada instancia necesita su propio client ID único. Dos clientes con el mismo ID se desconectarán mutuamente una y otra vez.
¿Debo elegir MQTT V5 o V3.1.1 en el nodo broker?
Elige V5 salvo que otra parte de tu sistema requiera 3.1.1. V5 añade caducidad de sesión, caducidad de mensajes, user properties y reason codes más claros, y ConnectMQ admite ambas versiones.



