Broker Mosquitto con MQTTS

Hace un tiempo publiqué una entrada cuyo tema principal era el protocolo MQTT mediante el broker Eclipse Mosquitto. En la entrada de hoy, Broker Mosquitto con MQTTS, describiré cómo utilizar el protocolo MQTT de forma segura, es decir, cómo utilizar el protocolo MQTTS.

El protocolo MQTT es un protocolo muy utilizado en los sistemas IoT y, para conseguir un nivel de seguridad adecuado, es necesario utilizar el protocolo con comunicaciones seguras.

1.-Componentes de seguridad

Para la creación de los certificados, claves privadas y los certificados de solicitud de firma utilizaremos OpenSSL. En los siguientes apartados, realizaré la descripción de los elementos necesarios para nuestro ejemplo de prueba.

Para facilitar la comprensión de los elementos a crear y la configuración del broker, utilizaré una carpeta, con nombre certs, en la cual se ubicarán las siguientes carpetas: carpeta ca, carpeta para almacenar los componentes de seguridad de la autoridad certificadora; carpeta broker, carpeta para almacenar los componentes de seguridad para el broker MQTT; y, por último, la carpeta client, carpeta para almacenar los componentes de seguridad para los clientes, en nuestro caso, los agentes con funcionalidad de publicadores y suscriptores.

La herramienta a utilizar para la creación de los diferentes componentes es OpenSSL la cual se encuentra instalada al menos en los sistemas Linux o Mac de forma predeterminada. Para utilizarla simplemente invocamos el comando openssl desde una consola de comandos.

1.1.- Creación de certificados

La creación de la autoridad de certificados la realizamos con el comando openssl y, para ello, nos ubicamos en la carpeta ~/certs2/ca en una consola de comandos. El comando a utilizar es el siguiente:

openssl req -new -x509 -days 365 -extensions v3_ca -keyout ca.key -out ca.crt

El comando anterior realiza la creación de un certificado definido en el fichero ca.crt y realiza la creación de una clave privada en el fichero ca.key. La validez del certificado es de un año (365 días) desde la fecha de creación. El comando requiere la introducción de unos campos necesarios como son, entre otros: password del certificado, país, ciudad, nombre de la compañía,…

1.2.- Creación de clave privada y certificados para el broker

La creación de las claves y certificados necesarios para el broker la realizamos con el comando openssl y, como en el casa anterior, nos ubicamos en la carpeta creada para ello, carpeta ~/certs2/broker. En este caso, debemos de realizar más operaciones las cuáles son:

  • Generación de una clave privada.

Para la creación de una clave privada RSA para el broker ejecutamos el siguiente comando:

openssl genrsa -out broker.key 2048

El comando anterior realiza la creación de una clave RSA en el fichero broker.key

  • Generación del fichero de solicitud de firmas csr.

Para la creación del fichero para realizar la solicitud de firmas para los certificados se emplea el siguiente comando openssl el cual utiliza la clave privada creada previamente, el comando es el siguiente:

openssl req -out broker.csr -key broker.key -new

La ejecución del comando anterior requiere de la inserción de un conjunto de datos como son, entre otros: país, ciudad y otros datos de identificación; de todos ellos, requiere una especial atención el campo CN Command Name el cual identifica el nombre del dominio en donde se ejecuta el broker, en nuestro caso, el campo CN tiene el valor ‘localhost’.

  • Generación del fichero certificado.

Por último, realizamos la creación del certificado con todos los elementos creados previamente. El comando es el siguiente:

openssl x509 -req -in broker.csr -CA ../ca/ca.crt -CAkey ../ca/ca.key -CAcreateserial -out broker.crt -days 100

El comando anterior realiza un certificado en el fichero broker.crt con una validez de 100 días utilizando el fichero de solicitud de firmas broker.csr y los ficheros de la autoridad certificadora ca.crt y ca.key.

1.3.- Creación de clave privada y certificados para los clientes

La creación de las claves y certificados necesarios para el broker lo realizamos con el comando openssl y, como en el casa anterior, nos ubicamos en la carpeta creada para ello, carpeta ~/certs2/client. En este caso, debemos de realizar más operaciones las cuáles son:

  • Generación de una clave privada.

Para la creación de una clave privada RSA para el cliente ejecutamos el siguiente comando:

openssl genrsa -out client.key 2048

El comando anterior realiza la creación de una clave RSA en el fichero client.key

  • Generación del fichero de solicitud de firmas csr.

Para la creación del fichero para realizar la solicitud de firmas para los certificados se emplea el siguiente comando openssl el cual utiliza la clave privada creada previamente, el comando es el siguiente:

openssl req -out client.csr -key client.key -new

La ejecución del comando anterior requiere de la inserción de un conjunto de datos como son, entre otros: país, ciudad y otros datos de identificación; de todos ellos, requiere una especial atención el campo CN Command Name el cual identifica el nombre del dominio en donde se ejecuta el broker, en nuestro caso, el campo CN tiene el valor ‘localhost’.

  • Generación del fichero certificado.

Por último, realizamos la creación del certificado con todos los elementos creados previamente. El comando es el siguiente:

openssl x509 -req -in client.csr -CA ../ca/ca.crt -CAkey ../ca/ca.key -CAcreateserial -out client.crt -days 100

El comando anterior realiza un certificado en el fichero client.crt con una validez de 100 días utilizando el fichero de solicitud de firmas client.csr y los ficheros de la autoridad certificadora ca.crt y ca.key.

2.- Configuración del broker Mosquitto

La configuración del broker Mosquitto se realiza en el fichero mosquitto.conf ubicado en la carpeta de instalación del mismo. Para poder operar con el broker es necesario que la configuración sea como mínimo la siguiente:

  listener 8883
  certfile /Users/usuario/mosquitto/certs2/broker/broker.crt
  keyfile /Users/usuario/mosquitto/certs2/broker/broker.key
  require_certificate true
  cafile /Users/usuario/mosquitto/certs2/ca/ca.crt
  use_identity_as_username true

3.- Ejemplo de uso

3.1.- Arranque del broker

Para arrancar Mosquitto con la configuración, en un entorno Linux/Mac, el comando a ejecutar es el siguiente:

/usr/local/opt/mosquitto/sbin/mosquitto -c /usr/local/etc/mosquitto/mosquitto.conf

La salida por consola del broker es la siguiente:

Consola del broker Mosquitto

3.2.- Arranque del suscriptor.

Pare simular la recepción de un mensaje utilizaremos la herramienta mosquitto_sub el cual simula la suscripción de un elemento. El comando a utilizar para ejecutar un suscriptor desde línea de comando es el siguiente:

mosquitto_sub -h localhost -t "casa/habitaciones/hab1/luz" --cafile "/Users/E050690/mosquitto/certs2/ca/ca.crt"  --cert "/Users/E050690/mosquitto/certs2/client/client.crt" --key "/Users/E050690/mosquitto/certs2/client/client.key" -p 8883

Los parámetros del comando anterior tienen la siguiente descripción:

  • -h.- Nombre del host donde está funcionando Mosquitto. Es el mismo nombre que el campo CN de los certificados.
  • -t.- Topic del broker donde se conecta el suscriptor.
  • –cafile.- Localización del certificado de la entidad certificadora.
  • –cert.- Localización del certificado del cliente, en nuestro caso, el componente suscriptor.
  • –key.- Localización de la clave privada del cliente, en nuestro caso, el componente suscriptor.
  • -p.- Puerto del protocolo MQTTS.

La consola del suscriptor queda vacía a la espera de los mensajes que realice el publicador/productor.

3.3.- Arranque del publicador.

Para simular el envío de un mensaje utilizaremos la herramienta mosquitto_pub el cual realiza la producción de mensajes a un topic del broker. El comando a utilizar para ejecutar una publicación de un mensaje desde la línea de comandos el el siguiente:

mosquitto_pub -h localhost -t "casa/habitaciones/hab1/luz" --cafile "/Users/E050690/mosquitto/certs2/ca/ca.crt"  --cert "/Users/E050690/mosquitto/certs2/client/client.crt" --key "/Users/E050690/mosquitto/certs2/client/client.key" -p 8883  -m "ON1"

Los parámetros del comando anterior tienen la siguiente descripción:

  • -h.- Nombre del host donde está funcionando Mosquitto. Es el mismo nombre que el campo CN de los certificados.
  • -t.- Topic del broker donde se publica el mensaje.
  • –cafile.- Localización del certificado de la entidad certificadora.
  • –cert.- Localización del certificado del cliente, en nuestro caso, el componente publicador.
  • –key.- Localización de la clave privada del productor, en nuestro caso, el componente publicador.
  • -p.- Puerto del protocolo MQTTS.
  • -m.- Mensaje que se publica en el topic -t

La salida de la consola del broker Mosquitto es la siguiente:

Consola del broker Mosquitto

La salida de la consola del simulador de del suscriptor es la siguiente:

4.- Conclusiones

La complejidad del ejercicio planteado es la creación de los certificados, claves privadas y certificados de petición de firma ya que la configuración y uso del suscriptor, publicador y broker, si se sabe su uso sin certificados, es relativamente sencilla. Un detalle importante es el valor asignado al campo Command Name (CN) de los certificados de firma ya que un valor erróneo puede originar errores de protocolo en las pruebas.