5. MQTT – Mosquitto TLS

Para añadir un nivel de seguridad con los mensajes MQTT se usa TLS. Los mensajes MQTT que se transmiten como texto simple en la red (inalambrica) y que podrían ser leidos.

Esta sección consta de dos partes: Primero la creación de los certificados y Segundo la configuración de Mosquitto.


1. Creación de Certificados

Básicamente son archivos que contienen las llaves de encriptación y se deben generar para poder realizar el proceso. Se recomienda usar una memoria usb para mover al menos el archivo de acceso para el dispositivo.

La generación se realiza con OpenSSL que viene incluido en Raspbian y se puede realizar en una consola local o remota (ssh)

1.1 llave para estación: CA Key Pair
openssl genrsa -des3 -out m2mqtt_ca.key 2048

Al usar la instrucción se pedira que escriba una frase para generar el archivo. De ésta manera se pueden crear diferentes certificados cuando sea necesario.

pi@raspberrypi:~ $ openssl genrsa -des3 -out m2mqtt_ca.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
...........................................+++++
.+++++
e is 65537 (0x010001)
Enter pass phrase for m2mqtt_ca.key:
Verifying - Enter pass phrase for m2mqtt_ca.key:

El archivo creado se puede revisar en el directorio donde se ejecutó la instrucción:

1.2 Certificado de estación: CA firmado con la llave

En éste paso se crea el certificado firmado con la llave creada en el paso anterior. Se requiere añadir información del país, provincia, ciudad e instutición para asociar el certificado, la información permite disponer de un contacto en caso que sea necesario actualizar o contactar el archivo.

openssl req -new -x509 -days 3650 -key m2mqtt_ca.key -out m2mqtt_ca.crt
1,3 Llave para broker: Mosquitto Broker Key Pair

Llave para generar el certificado del broker:

openssl genrsa -out m2mqtt_srv.key 2048
1.4 Certificado para Broker: Certificate Request from CA

Creación del certificado para el Broker usando la llave del paso anterior

openssl req -new -out m2mqtt_srv.csr -key m2mqtt_srv.key
1.5 Verificación de Certificados

Use la instrucción para comprobar que todo puede ser usado correctamente:

openssl x509 -req -in m2mqtt_srv.csr -CA m2mqtt_ca.crt -CAkey m2mqtt_ca.key -CAcreateserial -out m2mqtt_srv.crt -days 3650
1.6 Huella del certificado: fingerprint

Para usar en la programación del archivo.ino

openssl x509 -noout -in m2mqtt_srv.crt -fingerprint

2. Configuración de Mosquitto

La configuración del broker se usa para indicar los certificados requeridos para la encriptación de los mensajes.

Realice una copia de los certificados de la sección anterior previo a cambiar la configuración en el directorio: /etc/mosquitto/certs

La configuración de mosquitto está el archivo /etc/mosquitto/mosquitto.conf que se modifica para activar TLS

Desde la consola, abrir el archivo con:

sudo nano /etc/mosquitto/mosquitto.conf

Se añaden las instrucciones:

# Port to use for the default listener.
port 8883
# "c_rehash " each time you add/remove a certificate.
#capath
cafile /etc/mosquitto/certs/m2mqtt_ca.crt

# Path to the PEM encoded server certificate.
certfile /etc/mosquitto/certs/m2mqtt_srv.crt

# Path to the PEM encoded keyfile.
keyfile /etc/mosquitto/certs/m2mqtt_srv.key

# This option defines the version of the TLS protocol to use for this listener.
# The default value allows v1.2, v1.1 and v1.0, if they are all supported by
# the version of openssl that the broker was compiled against. For openssl >=
# 1.0.1 the valid values are tlsv1.2 tlsv1.1 and tlsv1. For openssl < 1.0.1 the
# valid values are tlsv1.
tls_version tlsv1.2

3.  Prueba de conexión

Verifique el estado del servidor MQTT desde una consola remota con ssh:

systemctl status mosquitto

con lo que se obtiene mensajes semejantes a:

● mosquitto.service - Mosquitto MQTT v3.1/v3.1.1 Broker
   Loaded: loaded (/lib/systemd/system/mosquitto.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2019-08-11 14:16:50 -05; 9min ago
     Docs: man:mosquitto.conf(5)
           man:mosquitto(8)
 Main PID: 394 (mosquitto)
    Tasks: 1 (limit: 2200)
   Memory: 2.4M
   CGroup: /system.slice/mosquitto.service
           └─394 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf

ago 11 14:16:50 raspberrypi mosquitto[394]: 1565551010: Config loaded from /etc/mosquitto/mosquitto.conf.
ago 11 14:16:50 raspberrypi mosquitto[394]: 1565551010: Opening ipv4 listen socket on port 8883.

Comprobando que esta en estado activo, se procede a realizar las pruebas de conexión:

3.1 Desde la consola ssh

con los parámetros, utilice los parámetros con los que generó los certificados.

mosquitto_sub -h 192.168.10.100 -p 8883 -t "home/garden/fountain" -u "usuarioprueba" -P "usuarioclave" --cafile m2mqtt_srv.crt --key m2mqtt_ca.key --cert m2mqtt_ca.crt -d

al ejecutar la instrucción, se pide la frase del certificado, la ingresa y obtiene:

pi@raspberrypi:~ $ mosquitto_sub -h localhost -p 8883 -t "home/garden/fountain" -u "usuarioprueba" -P "usuarioclave" --cafile m2mqtt_srv.crt --key m2mqtt_ca.
key --cert m2mqtt_ca.crt -d
Enter PEM pass phrase:
Client mosqsub|1557-raspberryp sending CONNECT
Client mosqsub|1557-raspberryp received CONNACK (0)
Client mosqsub|1557-raspberryp sending SUBSCRIBE (Mid: 1, Topic: home/garden/fountain, QoS: 0)
Client mosqsub|1557-raspberryp received SUBACK
Subscribed (mid: 1): 0
ON

Puede cambiar el estado con mosquitto_pub se escribe una instrucción semejante añadiendo el mensaje -m ‘ON’.

mosquitto_pub -h localhost -p 8883 -t "home/garden/fountain" -m "ON" -u "usuarioprueba" -P "usuarioclave" --cafile m2mqtt_srv.crt --key m2mqtt_ca.key --cert m2mqtt_ca.crt -d

con el siguiente resultado:

pi@raspberrypi:~ $ mosquitto_pub -h localhost -p 8883 -t "home/garden/fountain" -m "ON" -u "usuarioprueba" -P "usua
rioclave" --cafile m2mqtt_srv.crt --key m2mqtt_ca.key --cert m2mqtt_ca.crt -d
Enter PEM pass phrase:
Client mosqpub|1607-raspberryp sending CONNECT
Client mosqpub|1607-raspberryp received CONNACK (0)
Client mosqpub|1607-raspberryp sending PUBLISH (d0, q0, r0, m1, 'home/garden/fountain', ... (2 bytes))
Client mosqpub|1607-raspberryp sending DISCONNECT
3.2 Con el programa MQTT.fx

Otra opción para probar la conexión es usando un programa desde una PC y con el certificado de cliente, por ejemplo MQTT.FX que lo puede descargar de forma gratuita.

Realice una copia del certificado de cliente en la pc donde instala el programa MQTT.FC en un directorio de trabajo.

Use los parámetros requeridos para la conexión en la ventana del menú «extras/edit/connection profiles»  para usuario y clave, TLS, etc

Se presiona conectar a MQTT, luego se suscribe al tópico de interés y se puede publicar en el mismo tópico.

4. Mosquitto en Home Assistant

Para conectar Home-Assistant al broker Mosquitto, se requiere configurar los parámetros de conexión:

Actualizar el inicio del servicio:

sudo nano /etc/systemd/system/home-assistant@homeassistant.service

En la línea correspondiente a After=

[Unit]
Description=Home Assistant
After=network.target mosquitto.service

Se actualiza el archivo configuration.yaml con la instrucción:

sudo nano /home/homeassistant/.homeassistant/configuration.yaml

añadiendo las instrucciones con los datos propuestos en el ejemplo que precede:

mqtt:
  broker: localhost
  port: 8883 #1883
  client_id: 'Raspi01'
  username: 'usuarioprueba'
  password: 'usuarioclave'
  tls_insecure: False
  protocol: '3.1.1'
  certificate:  '/home/pi/m2mqtt_srv.crt'
  # client_key:  '/home/pi/m2mqtt_ca.key'
  # client_cert: '/home/pi/m2mqtt_ca.crt'
  tls_version: '1.2'

Al reiniciar Home-Assistant, debería iniciar con la configuración propuesta.

Recuerde revisar los permisos de lectura en el directorio de los archivos para los certificados (ls -l). Por ejemplo:

pi@raspberrypi:~ $ ls -l
-rw-r--r-- 1 pi homeassistant 1440 ago  3 13:02 m2mqtt_ca.crt
-rw-r--r-- 1 pi homeassistant 1751 ago  3 13:02 m2mqtt_ca.key
-rw-r--r-- 1 pi homeassistant   41 ago  3 13:02 m2mqtt_ca.srl
-rw-r--r-- 1 pi homeassistant 1318 ago  3 13:02 m2mqtt_srv.crt
-rw-r--r-- 1 pi homeassistant 1054 ago  3 13:02 m2mqtt_srv.csr
-rw-r--r-- 1 pi homeassistant 1679 ago  3 13:02 m2mqtt_srv.key

si requiere cambiarlos usar la instrucción: chown usuario archivo.

o en otro caso cambiar los permisos de lectura par todo los demás


Referencias:

https://mcuoneclipse.com/2017/04/14/enable-secure-communication-with-tls-and-the-mosquitto-broker/

http://www.steves-internet-guide.com/mosquitto-tls/

https://www.hivemq.com/blog/mqtt-security-fundamentals-tls-ssl/

https://www.home-assistant.io/docs/mqtt/broker/

 

4. MQTT – Mosquitto: usuario y contraseña

Para crear un nivel de control de cuáles dispositivos operan con el servidor MQTT, se añaden usuarios y contraseñas.

1. Crear usuarios y contraseñas

Mosquitto dispone de una instruccion para generar un archivo de contraseñas: mosquitto_passwd. La instruccion para crear el usuario requiere escribir una contraseña a ser usada solo para el servicio MQTT:

sudo mosquitto_passwd -c /etc/mosquitto/passwd usuarioprueba

Para cada usuario se validan las contraseñas, se solicita escribirlas dos veces:

Nota puede usar para el ejemplo : «usuarioprueba» , «usuarioclave»

pi@raspberrypi:~ $ sudo mosquitto_passwd -c /etc/mosquitto/passwd usuarioprueba
Password:
Reenter password:

2. Añadir control de usuarios a la configuración

Añadir el control de usuarios require modificar el archivo de configuración para indicar la ubicación del archivo de contraseñas de cada usuario registrado.

sudo nano /etc/mosquitto/conf.d/default.conf

Y escribir en el archivo:

password_file /etc/mosquitto/passwd
allow_anonymous false

La última instrucción, no permitirá que se den servicio a mensajes sin autenticación de usuario.

Se guarda el archivo (^O) y sale de la aplicacion (^X).

Una vez completada la acción anterior, se debe reiniciar mosquitto:

sudo systemctl restart mosquitto

3. Pruebas de operación

Realice nuevamente las pruebas de mensajes MQTT. Ahora se requiere indicar detalles del usuario que usa el servicio de suscripción y publicación:

mosquitto_sub -d -t "oficina/mensaje" -u "usuarioprueba" -P "usuarioclave"

mosquitto_pub -d -t "oficina/mensaje" -m "controlando usuario" -u "usuarioprueba" -P "usuarioclave"

Los resultados se muestran incluso con mayor detalle:

pi@raspberrypi:~ $ mosquitto_sub -d -t "oficina/mensaje" -u "usuarioprueba" -P "usuarioclave"
Client mosqsub|754-raspberrypi sending CONNECT
Client mosqsub|754-raspberrypi received CONNACK (0)
Client mosqsub|754-raspberrypi sending SUBSCRIBE (Mid: 1, Topic: oficina/mensaje, QoS: 0)
Client mosqsub|754-raspberrypi received SUBACK
Subscribed (mid: 1): 0
Client mosqsub|754-raspberrypi received PUBLISH (d0, q0, r0, m0, 'oficina/mensaje', ... (19 bytes))
controlando usuario

Como comprobación, intente enviar un mensaje sin usuario o con clave errada.

4. Mosquitto en Home Assistant

Para conectar Home-Assistant al broker Mosquitto, se requiere configurar los parámetros de conexión:

Actualizar el inicio del servicio:

sudo nano /etc/systemd/system/home-assistant@homeassistant.service

En la línea correspondiente a After=

[Unit]
Description=Home Assistant
After=network.target mosquitto.service

Se actualiza el archivo configuration.yaml con la instrucción:

sudo nano /home/homeassistant/.homeassistant/configuration.yaml

añadiendo las instrucciones con los datos propuestos en el ejemplo que precede:

mqtt:
  broker: localhost
  port: 8883 #1883
  client_id: 'Raspi01'
  username: 'usuarioprueba'
  password: 'usuarioclave'

Al reiniciar Home-Assistant, debería iniciar con la configuración propuesta.

5. MQTT con TLS

Para aumentar el nivel de seguridad de los mensajes MQTT, se añade encriptado TLS a los mensajes. El tema se desarrolla en la siguente página de publicación.


Referencias:

https://mcuoneclipse.com/2017/04/14/enable-secure-communication-with-tls-and-the-mosquitto-broker/

https://aprendiendoarduino.wordpress.com/tag/configurar-mosquitto/

http://www.steves-internet-guide.com/mosquitto-tls/

https://www.hivemq.com/blog/mqtt-security-fundamentals-tls-ssl/

3. MQTT – Mosquitto instalar

Como protocolo para comunicar el broker con los dispositivos será MQTT.

La versión seleccionada es Mosquitto, disponible en el enlace mostrado.

1. Instalar Mosquitto en Raspberry Pi

La forma simplificada de instalar mosquitto es desde una ventana de terminal, que instala e inicializa el servicio. Recuerde actualizar Raspbian antes de éste proceso, notas en la sección de RaspberryPi-Actualizar.

sudo apt-get install mosquitto mosquitto
sudo apt-get install mosquitto mosquitto-clients

Más información sobre la instalación se pueden encontrar en:

https://mosquitto.org/

Si se completaron las intrucciones anteriores, Mosquitto se inicia al terminar el proceso, por lo que se puede continuar con las pruebas.

2. Pruebas de Mosquitto

Para probar si la instalación se completó, se puede usar las instrucciones en dos ventanas separadas de comandos (local o remota ssh):

2.1 Para comprobar que se encuentra funcionando Mosquitto, use:

systemctl status mosquitto

obtendrá una respuesta semejante a:

● mosquitto.service - Mosquitto MQTT v3.1/v3.1.1 Broker
   Loaded: loaded (/lib/systemd/system/mosquitto.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2019-07-27 23:13:10 -05; 6min ago

En caso que no esté iniciado el proceso, escriba la instrucción:

mosquitto

2.2 en una ventana de comando, se suscribirse a un tópico ejemplo, para recibir los mensajes:

mosquitto_sub -v -t "oficina/mensaje"

2.3. en otra ventana publicar un nuevo estado en el tópico:

mosquitto_pub -t "oficina/mensaje" -m "mensaje mqtt"

Si aparece el estado en la ventana del numeral 2.2, MQTT se encuentra funcionando correctamente.

Para iniciar una prueba, también puede usar el programa cliente MQTT.fx, requiere descagar y configurar los parámetros de MQTT.

Esta es una instalación básica, procesa cualquier subscripción o publicación de mensajes. Tiene utilidad para probar los primeros mensajes de un dispositivo básico en construcción.

Para añadir un nivel de seguridad mediante usuario y constraseña, se requieren algunos pasos adicionales descritos en otra entrada del blog.

3. Mosquitto en Home Assistant

Para conectar Home-Assistant al broker Mosquitto, se requiere configurar los parámetros de conexión:

Actualizar el inicio del servicio:

sudo nano /etc/systemd/system/home-assistant@homeassistant.service

En la línea correspondiente a After=

[Unit]
Description=Home Assistant
After=network.target mosquitto.service

Se actualiza el archivo configuration.yaml con la instrucción:

sudo nano /home/homeassistant/.homeassistant/configuration.yaml

añadiendo las instrucciones con los datos propuestos en el ejemplo que precede:

mqtt:
  broker: localhost
  port: 8883 #1883
  client_id: 'Raspi01'

Al reiniciar Home-Assistant, debería iniciar con la configuración propuesta.


Referencia:

https://aprendiendoarduino.wordpress.com/tag/configurar-mosquitto/

2. Home Assistant – Actualizar

Las instrucciones para actualizar Home Assistant consiste en:
cambiar al usuario homeassistant, definir el directorio de trabajo y actualizar desde pip.

$ sudo -u homeassistant -H -s
$ source /srv/homeassistant/bin/activate
$ pip3 install --upgrade homeassistant

Descritas en la Referencia:

https://www.home-assistant.io/docs/installation/raspberry-pi/

La actualización se realiza usando pip pues la base del programa es Python.

Se obtiene una respuesta semejante a:

pi@raspberrypi:~ $ sudo -u homeassistant -H -s
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting homeassistant
  Downloading https://files.pythonhosted.org/packages/23/e3/fd04c8462343ef5794970edf3985568fb825c324271f18b64008d81e43d3/homeassistant-0.93.1-py3-none-any.whl (4.7MB)
     |████████████████████████████████| 4.7MB 3.3MB/s
Collecting ruamel.yaml==0.15.94 (from homeassistant)
  Downloading https://files.pythonhosted.org/packages/24/f1/1adcf396711d3c9c30b67a5c850cfb64afbccd41d7d85adf87732e4b156f/ruamel.yaml-0.15.94.tar.gz (312kB)
     |████████████████████████████████| 317kB 2.8MB/s
Requirement already satisfied, skipping upgrade: pip>=8.0.3 in /srv/homeassistant/lib/python3.5/site-packages (from homeassistant)
....

1. Home Assistant – Instalar

Home Assistant es una aplicación con lo básico para iniciar un proyecto de IOT para el hogar.

Permite acceder a la información y control de los dispositivos mediante una página web de configuración simplificada, puede ser personalizada, facilitando la instalación básica para revisar conceptos básicos.

https://www.home-assistant.io/

Ésta sección muestra notas tomadas como documentación simplificada al realizar un proyecto básico de IOT.

El dispositivo usado para la instalación es un Raspberry Pi.


1. Instalación manual con Raspbian en Raspberry Pi

Para la implementación de un broker simplificado que gestione las conexiones con cada dispositivo se usa un Raspberry Pi con Raspbian.

En adelante, se considera que el Raspbian ya se encuentra instalado, actualizado, operativo y con dirección IP fija, aquí se resumen los pasos para la instalacón.

Las instrucciones paso a paso para la instalación de Home-Assistant en raspberry se encuentran en el enlace:

https://www.home-assistant.io/docs/installation/raspberry-pi/

Para la instalación se recomienda actualizar Rasbian a la fecha, puede usar las indicaciones en la sección correspondiente Raspbian-Actualizar

Luego se continua con el proceso de instalación en entorno virtual.


2. Crea un Entorno virtual en Python

  • Instalar Python3 en el entorno virtual.
    sudo apt-get install python3 python3-venv python3-pip
  • Crear un usuario para homeassistant
    sudo useradd -rm homeassistant -G dialout,gpio
  • Crear un directorio de trabajo
cd /srv
sudo mkdir homeassistant
sudo chown homeassistant:homeassistant homeassistant
    • Configurar un entorno virtual
sudo -u homeassistant -H -s
cd /srv/homeassistant
python3 -m venv .
source bin/activate
    • Añadir los componentes Python

hasta el momento,  la linea de shell debe tener la forma de:
(homeassistant) homeassistant@raspberrypi:/srv/homeassistant $
donde se puede escribir la instrucción:

python3 -m pip install wheel

3. Instala homeassistant en entorno virtual

  • Iniciar el proceso de instalación, en la línea de shell mostrada en el estado anterior, se escribe:
pip3 install homeassistant

donde se puede observar el progreso de instalación de la siguiente forma:

(homeassistant) homeassistant@raspberry:/srv/homeassistant $ pip3 install homeassistant
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting homeassistant
  Downloading https://files.pythonhosted.org/packages/87/c9/f41fcf931501f07ef9ca12365fd09eb879f6755618f375b058a229d9c94b/homeassistant-0.103.6-py3-none-any.whl (6.0MB)
    100% |████████████████████████████████| 6.0MB 53kB/s
Collecting cryptography==2.8 (from homeassistant)
  Downloading https://files.pythonhosted.org/packages/be/60/da377e1bed002716fb2d5d1d1cab720f298cb33ecff7bf7adea72788e4e4/cryptography-2.8.tar.gz (504kB)
    100% |████████████████████████████████| 512kB 343kB/s
  Installing build dependencies ... done
...

El programa se puede iniciar usando la instrucción.

hass
  • Durante el proceso de instalación, una vez que se ha llegado al proceso de:
[homeassistant.bootstrap] Home Assistant initialized in 525.83s
[homeassistant.core] Starting Home Assistant
(MainThread) [homeassistant.core] Timer:starting
  • se debe ingresar via web para ingresar los datos de usuario, palabra clave, ubicación geográfica y así completar la instalación.
  • Para el ejemplo mostrado debería ingresar desde un navegador de internet a:
192.168.10.100:8123

Cuando se termine el proceso de instalación en la página web, será necesario configurar el inicio automático, asi al reiniciar el Raspberry Pi, todo continue funcionando nomalmente.

– se debe salir del proceso de la consola con las teclas Ctrl-C

– regresar al usuario básico con la instrucción:  exit


4. Configura el inicio automático de Home Assistant

  • Crear un archivo de servicio con nombre semejante al mostrado en la instrucción:
    sudo nano -w /etc/systemd/system/home-assistant@homeassistant.service
    

    El contenido del archivo siguen las siguientes instrucciones:

    [Unit]
    Description=Home Assistant
    After=network-online.target 
    
    [Service]
    Type=simple
    User=%i
    ExecStart=/srv/homeassistant/bin/hass -c "/home/homeassistant/.homeassistant"
    
    [Install]
    WantedBy=multi-user.target
    

Configure el autoinicio de Home Assistant con la instrucción:

sudo systemctl enable home-assistant@homeassistant

Para probar que todo funciona bién se reinicia el Raspberry Pi con la instruccion sudo reboot


Para comprobar que las configuracines sean las correctas u otras opciones de administrador, se puede activar las opciones de modo avanzado para el usuario administrador desde la sección «administrador/modo avanzado»

Se activan y muestran los botones en «configuración/controles de servidor»


Referencia: Python Virtual enviroment

https://www.home-assistant.io/docs/autostart/systemd/