Mosquitto es un intermediario de mensajes de código abierto que utiliza el transporte de telemetría de Message Queue Server (MQTT ) Protocolo. El protocolo está diseñado para proporcionar una comunicación ligera al Internet de las cosas (IoT ) dispositivos. Se usa comúnmente para el seguimiento GPS de vehículos, domótica, sensores ambientales y recopilación de datos a gran escala.
El protocolo MQTT se ejecuta sobre el modelo TCP/IP. Al ser liviano, su pequeña huella de código le permite crear aplicaciones para dispositivos con recursos mínimos. Se basa en el modelo de publicación/suscripción. En este modelo, el cliente se conecta al servidor Mosquitto, que actúa como intermediario para enviar información a otros clientes suscritos a un canal.
En este tutorial, instalará Mosquitto y configurará el bróker para usar SSL para proteger las comunicaciones.
Requisitos
- Un servidor Ubuntu 20.04 con un usuario no root con privilegios sudo.
- Un nombre de dominio (
myqtt.example.com
) apuntó a su servidor.
Paso 1:instalar el servidor y el cliente Mosquitto
Ubuntu se envía con la versión anterior 1.6 de Mosquitto. Para instalar la última versión, agregue el repositorio oficial de Mosquitto.
$ sudo add-apt-repository ppa:mosquitto-dev/mosquitto-ppa
Instale el servidor Mosquitto y el cliente.
$ sudo apt install mosquitto mosquitto-clients
Comprueba el estado del servidor.
$ sudo systemctl status mosquitto ? mosquitto.service - Mosquitto MQTT Broker Loaded: loaded (/lib/systemd/system/mosquitto.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2022-01-25 09:18:40 UTC; 25s ago Docs: man:mosquitto.conf(5) man:mosquitto(8) Main PID: 119694 (mosquitto) Tasks: 1 (limit: 2274) Memory: 1.0M CGroup: /system.slice/mosquitto.service ??119694 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf Jan 25 09:18:39 <userid> systemd[1]: Starting Mosquitto MQTT Broker... Jan 25 09:18:40 <userid> systemd[1]: Started Mosquitto MQTT Broker.
Paso 2:configurar la autenticación de contraseña MQTT
Mosquitto viene con una utilidad para generar un archivo de contraseña llamado mosquitto_passwd
. Mosquitto almacena todas las configuraciones en el /etc/mosquitto
directorio.
Ejecute el siguiente comando para generar un archivo de contraseña cifrada en /etc/mosquitto/passwd
para el nombre de usuario username
. Introduzca una contraseña de su elección.
$ sudo mosquitto_passwd -c /etc/mosquitto/passwd username Password: Reenter password:
A continuación, cree un default.conf
archivo bajo el /etc/mosquitto/conf.d
directorio y ábralo para editarlo.
$ sudo nano /etc/mosquitto/conf.d/default.conf
Pegue las siguientes líneas para especificar la ubicación del archivo de contraseña. Si omite el campo de escucha, siempre se conectará de forma anónima, independientemente de la configuración.
listener 1883 password_file /etc/mosquitto/passwd
Guarde el archivo presionando Ctrl + X e ingresando Y cuando se le solicite.
Reinicie el servidor Mosquitto para implementar el cambio.
$ sudo systemctl restart mosquitto
Paso 3:probar el cliente Mosquitto
Dependiendo del caso de uso, puede usar el cliente Mosquitto para enviar y recibir mensajes sobre diferentes temas. Un cliente es un suscriptor o un editor.
El siguiente paso es suscribirse a un tema. En el protocolo MQTT, un tema se refiere a una cadena utilizada por el servidor/intermediario para filtrar mensajes para los clientes conectados. Estos son algunos temas de muestra que puede usar en una aplicación de automatización del hogar.
- inicio/luces/sala de estar
- hogar/luces/cocina
- casa/luces/dormitorio_principal
- casa/luces/dormitorio_de_ninos
Para suscribirse a un tema, ejecute mosquitto_sub -t
comando seguido del tema. Por ejemplo, para suscribirse a home/lights/kitchen
tema, ejecute el siguiente comando.
$ mosquitto_sub -u username -P YOUR_PASSWORD -t "home/lights/kitchen"
No cierre la ventana existente. Abra una nueva ventana de terminal para publicar un mensaje en home/lights/kitchen
tema usando el siguiente comando.
$ mosquitto_pub -u username -P YOUR_PASSWORD -m "ON" -t "home/lights/kitchen"
Regrese a la primera ventana de terminal y recibirá ON
carga útil.
ON
A continuación, envíe el OFF
mensaje sobre el mismo tema desde el segundo terminal.
$ mosquitto_pub -u username -P YOUR_PASSWORD -m "OFF" -t "home/lights/kitchen"
El primer terminal mostrará el mensaje recién publicado.
ON
Si intenta enviar un comentario no autenticado, fallará. Por ejemplo, pruebe el siguiente comando.
$ mosquitto_sub -t "home/lights/sitting_room" Connection error: Connection Refused: not authorised.
No se recomienda, pero debe agregar la siguiente línea a /etc/mosquitto/conf.d/default.conf
archivo si desea ejecutar los comandos sin autenticación.
allow_anonymous true
Paso 4:instalar SSL
Para instalar un certificado SSL usando Let's Encrypt, necesitamos descargar la herramienta Certbot. Usaremos el instalador del paquete Snapd para eso.
Instale el instalador de Snap.
$ sudo apt install snapd
Asegúrese de que su versión de Snapd esté actualizada.
$ sudo snap install core $ sudo snap refresh core
Instale Certbot.
$ sudo snap install --classic certbot
Use el siguiente comando para asegurarse de que el comando Certbot se ejecute creando un enlace simbólico al /usr/bin
directorio.
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Genere un certificado SSL.
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d mqtt.example.com
El comando anterior descargará un certificado en /etc/letsencrypt/live/mqtt.example.com
directorio en su servidor.
Generar un grupo Diffie-Hellman certificado.
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Cree un directorio raíz web de desafío para la renovación automática de Let's Encrypt.
$ sudo mkdir -p /var/lib/letsencrypt
Cree un trabajo cron para renovar el SSL. Se ejecutará todos los días para verificar el certificado y renovarlo si es necesario. Para eso, primero crea el archivo /etc/cron.daily/certbot-renew
y ábralo para editarlo.
$ sudo nano /etc/cron.daily/certbot-renew
Pegue el siguiente código.
#!/bin/sh certbot renew --cert-name mqtt.example.com --webroot -w /var/lib/letsencrypt/
Guarde el archivo presionando Ctrl + X e ingresando Y cuando se le solicite.
Cambie los permisos en el archivo de tareas para que sea ejecutable.
$ sudo chmod +x /etc/cron.daily/certbot-renew
Paso 5:configurar MQTT SSL
Ahora que tenemos los certificados SSL listos, debemos proporcionarles acceso a Mosquitto. Para esto, necesitamos copiar los certificados a una ubicación desde donde Mosquitto pueda acceder a ellos.
$ sudo cp /etc/letsencrypt/live/mqtt.example.com/fullchain.pem /etc/mosquitto/certs/server.pem $ sudo cp /etc/letsencrypt/live/mqtt.example.com/privkey.pem /etc/mosquitto/certs/server.key
Cambiar la propiedad del /etc/mosquitto/certs
directorio al mosquitto
usuario creado durante la instalación.
$ sudo chown mosquitto: /etc/mosquitto/certs
El siguiente paso para habilitar el cifrado SSL para Mosquitto es especificar la ubicación de los certificados SSL. Abra el archivo de configuración para editarlo.
$ sudo nano /etc/mosquitto/conf.d/default.conf
Pegue el siguiente código al final del archivo.
. . . listener 8883 certfile /etc/mosquitto/certs/server.pem cafile /etc/ssl/certs/ISRG_Root_X1.pem keyfile /etc/mosquitto/certs/server.key dhparamfile /etc/ssl/certs/dhparam.pem
Guarde el archivo presionando Ctrl + X e ingresando Y Cuando se le solicite. Asegúrese de dejar una nueva línea final al final del archivo.
El listener 8883
parte configura el oyente cifrado. Es el puerto estándar para MQTT + SSL, denominado MQTTS. Las siguientes cuatro líneas especifican la ubicación de los archivos SSL.
Reinicie Mosquitto para actualizar la configuración.
$ sudo systemctl restart mosquitto
Deberá actualizar el firewall para permitir conexiones al puerto 8883.
$ sudo ufw allow 8883
A continuación, debemos probar la funcionalidad usando mosquitto_pub
comando.
$ mosquitto_pub -h mqtt.example.com -t "home/lights/kitchen" -m "hello" -p 8883 --capath /etc/ssl/certs/ -u username -P YOUR_PASSWORD
Como puede ver, hemos incluido ciertos parámetros adicionales, incluido el número de puerto y la ruta a los certificados SSL. Siempre que necesite usar SSL, siempre tendrá que especificar el nombre de host completo, es decir, mqtt.example.com
en lugar de localhost
de lo contrario, daría un error.
También deberá agregar el --capath
directiva cada vez. Le dice al cliente Mosquitto que busque los certificados raíz instalados por el sistema operativo.
Paso 6:configurar la renovación de SSL
Certbot renovará automáticamente su certificado antes de que caduque. Pero hay que indicarle que copie los certificados renovados en /etc/mosquitto/certs
directorio y reinicie el servicio Mosquitto.
Vamos a hacer eso creando un script de shell. Crea un archivo mosquitto-copy.sh
en /etc/letsencrypt/renewal-hooks/deploy
directorio.
$ sudo nano /etc/letsencrypt/renewal-hooks/deploy/mosquitto-copy.sh
Pegue el siguiente código en él. Reemplace el valor de MY_DOMAIN
variable con su dominio. El ${RENEWED_LINEAGE}
la variable apunta a /etc/letsencrypt/live/mqtt.example.com
directorio durante la renovación.
# Set which domain this script will be run for MY_DOMAIN=mqtt.example.com # Set the directory that the certificates will be copied to. CERTIFICATE_DIR=/etc/mosquitto/certs if [ "${RENEWED_DOMAINS}" = "${MY_DOMAIN}" ]; then # Copy new certificate to Mosquitto directory cp ${RENEWED_LINEAGE}/fullchain.pem ${CERTIFICATE_DIR}/server.pem cp ${RENEWED_LINEAGE}/privkey.pem ${CERTIFICATE_DIR}/server.key # Set ownership to Mosquitto chown mosquitto: ${CERTIFICATE_DIR}/server.pem ${CERTIFICATE_DIR}/server.key # Ensure permissions are restrictive chmod 0600 ${CERTIFICATE_DIR}/server.pem ${CERTIFICATE_DIR}/server.key # Tell Mosquitto to reload certificates and configuration pkill -HUP -x mosquitto fi
Guarde el archivo presionando Ctrl + X e ingresando Y cuando se le solicite.
Haz que el archivo sea ejecutable.
$ sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/mosquitto-copy.sh
Este script se ejecutará automáticamente en cada renovación exitosa del certificado.
Si está ejecutando Mosquitto y un servidor web como Nginx, debe indicarle a Certbot que detenga el servidor antes de la renovación y lo inicie nuevamente una vez que finalice. Para hacerlo, abra el archivo etc/letsencrypt/renewal/mqtt.example.com.conf
.
$ sudo nano /etc/letsencrypt/renewal/mqtt.example.com.conf
Agregue las siguientes líneas al final del archivo. Cambie los comandos según el servidor web que esté utilizando.
pre_hook = systemctl stop nginx post_hook = systemctl start nginx
Guarde el archivo presionando Ctrl + X e ingresando Y cuando se le solicite.
Ejecute un ensayo de Certbot para verificar.
$ sudo certbot renew --dry-run
Si no ve ningún error, significa que todo está configurado.
Paso 7:Configurar Websockets
Puede configurar Mosquitto para usar el protocolo MQTT desde los navegadores usando Javascript usando la funcionalidad Websockets. Para habilitarlo, abra el archivo de configuración.
$ sudo nano /etc/mosquitto/conf.d/default.conf
Pegue las siguientes líneas al final del archivo.
. . . listener 8083 protocol websockets certfile /etc/mosquitto/certs/server.pem cafile /etc/ssl/certs/ISRG_Root_X1.pem keyfile /etc/mosquitto/certs/server.key dhparamfile /etc/ssl/certs/dhparam.pem
Guarde el archivo presionando Ctrl + X e ingresando Y cuando se le solicite.
Si nota, es el mismo bloque que usamos para habilitar SSL, excepto por los campos de número de puerto y protocolo. 8083 es el puerto más común utilizado por MQTT para hablar mediante WebSockets.
Reinicie el servicio Mosquitto.
$ sudo systemctl restart mosquitto
Abra el puerto 8083.
$ sudo ufw allow 8083
Necesitamos usar un cliente MQTT basado en navegador para probar la funcionalidad de WebSockets. Hay muchos clientes disponibles, pero usaremos el cliente HiveMQ Websocket para nuestro propósito. Inicie el cliente en su navegador y verá lo siguiente.
Como se muestra en la captura de pantalla anterior, complete los campos como se muestra.
- El host debe ser el dominio de su servidor Mosquitto, mqtt.example.com.
- El puerto debe ser 8083.
- El campo ClientID se puede dejar como está.
- El nombre de usuario debe ser su nombre de usuario de Mosquitto.
- La contraseña debe ser la contraseña que creó anteriormente.
- Compruebe el SSL caja.
Presiona el botón Conectar y el cliente HiveMQ se conectará a su servidor Mosquitto.
Una vez conectado, ingresa home/lights/kitchen
como tema, ingresa cualquier mensaje y presiona Publicar .
El mensaje aparecerá en tu mosquitto_sub
ventana de terminal que confirma la conexión exitosa.
Esto muestra que la implementación de Websockets es exitosa.
Conclusión
Esto concluye nuestra configuración de un servidor MQTT seguro, protegido con contraseña y cifrado con SSL en una máquina basada en Ubuntu 20.04. Si tiene alguna pregunta, publíquela en los comentarios a continuación.