Ejemplo de configuración de canal MQTT utilizando la autenticación TLS

Este ejemplo le guía a través de un ejemplo de configuración de un canal MQTT que utiliza la autenticación TLS. Configura un canal entre MQTT y Mosquitto.

El ejemplo utiliza un Docker contenedor para ambosIBM® MQ enRed Hat® Enterprise Linux® y Mosquitto en CentOS, pero aplica para cualquier tipo de servidor. (CentOS se ha utilizado para Mosquitto debido a titularidades de registro.)

En este ejemplo se presupone que conoce los cambios de configuración descritos en MQ Configuración del canal de telemetría para la autenticación del canal mediante TLS.

Configurar el almacén de claves y el canal de IBM MQ para TLS unidireccional

[ MQ 9.4.0 Jun 2024][ MQ 9.4.0 Jun 2024]Importante: Desde IBM MQ 9.4.0, los repositorios de claves CMS y los archivos stash no son compatibles con los canales AMQP y MQTT que utilizan SSL/TLS. Utilice los repositorios de claves PKCS #12 y proteja las contraseñas del repositorio de claves utilizando en su lugar el sistema de protección de contraseñas IBM MQ .
Realice los pasos siguientes:
  1. [ MQ 9.4.0 Jun 2024][ MQ 9.4.0 Jun 2024]Cree un almacén de claves PKCS #12 en IBM MQ :
    runmqakm -keydb -create -db mqtt.p12 -pw "passw0rd" -type p12
  2. [ MQ 9.4.0 Jun 2024][ MQ 9.4.0 Jun 2024]Crear un certificado personal:
    runmqakm -cert -create -db mqtt.p12 -pw "passw0rd" -size 2048 -dn "CN= mqm, OU=MQTest, O=MQSupport, C=US" -sig_alg SHA256_WITH_RSA -label ibmwebspheremqmqm
    Puede utilizar el mandato siguiente para confirmar la creación del certificado:
    runmqakm -cert -list -v -db mqtt.p12 -pw "passw0rd"
  3. [ MQ 9.4.0 Jun 2024][ MQ 9.4.0 Jun 2024]Cree el canal MQTT introduciendo el siguiente comando en el indicador runmqsc:
    DEFINE CHANNEL(MQTTDEMO) CHLTYPE(MQTT) BACKLOG(4096) PORT(8883) MCAUSER('mqm') PROTOCOL(MQTTV311,MQTTV3,HTTP) SSLCAUTH(OPTIONAL) SSLCIPH('SSL_RSA_WITH_AES_256_CBC_SHA256') SSLKEYR('/var/mqm/mqtt/mqtt.p12') SSLKEYP('passw0rd') TRPTYPE(TCP)
    Tenga en cuenta que el canal utiliza asignaciones de cifrado Java, consulte TLS CipherSpecs y CipherSuites en las clases IBM MQ para JMS.
  4. Extraiga el certificado:
    runmqakm -cert -extract -db mqtt.p12 -pw "passw0rd" -label ibmwebspheremqmqm -target serverCert.pem

Instalar Mosquitto en CentOS en un contenedor Docker

Complete los siguientes pasos para crear un Docker contenedor con Mosquitto funcionando CentOS:

  1. docker pull centos
  2. docker run -it centos /bin/bash
  3. dnf -y install epel-release
  4. dnf -y install mosquitto

Mover certificado de firmante a Mosquitto

Realice los pasos siguientes para mover el certificado que ha creado en IBM MQ a Mosquitto. Estos pasos se ejecutan en la máquina host de Docker .
  1. Vea los ID de contenedor en Docker:
    docker container ls
  2. Copie el archivo del contenedor de docker en el docker del sistema local
    cp MQ_Container_ID:/var/mqm/mqtt/serverCert.pem serverCert.pem 
  3. Copie el archivo de la máquina local en el directorio raíz de la máquina centOS :
    docker cp serverCert.pem CentOS_ContainerID:/serverCert.pem

Publicar con Mosquitto

Publique un mensaje de prueba en Mosquitto utilizando el mandato siguiente:
mosquitto_pub -h 172.17.0.2 --cafile serverCert.pem --insecure -p 8883 -i mosquittoClient -t test -m 'test message' -d
Los argumentos del mandato tienen los significados siguientes:
-h
La dirección IP del host de Red Hat Enterprise Linux (se puede encontrar utilizando nslookup).
--cafile
El archivo que contiene el certificado de firmante.
--insecure
Esta opción se especifica porque el ejemplo utiliza un certificado autofirmado. No utilice esta opción cuando utilice certificados CA reales.
-p
Número de puerto.
-i
ID de cliente.
-t
El tema en el que se está publicando.
-m
El mensaje que se está publicando.
-d
Habilitar mensajes de depuración.

Configurar el canal MQTT para la autenticación TLS mutua

Especifique el mandato siguiente para volver a configurar el canal MQTT como SSLCAUTH (REQUIRED).

ALTER CHANNEL(MQTTDEMO) CHLTYPE(MQTT) SSLCAUTH(REQUIRED)

Cree un par de clave/certificado en el servidor Mosquitto y añádalo a IBM MQ

Especifique los mandatos siguientes para crear el par clave/certificado en Mosquitto:

  1. Utilice openSSL para crear el par clave/certificado para Mosquitto:
    openssl req -x509 -newkey rsa:4096 -keyout mosquittoKey.pem -out mosquittoCert.pem -subj "/CN=Mosquitto"
  2. Liste los ID de contenedor para los contenedores:
    docker container ls
  3. Copie el certificado Mosquitto en el docker del sistema local:
    docker cp CentOS_ContainerID:mosquittoCert.pem .
  4. Copie el certificado Mosquitto en IBM MQ:
    docker cp mosquittoCert.pem MQ_Container_ID:/var/mqm/mqtt
  5. Añada el certificado al almacén de claves de IBM MQ :
    runmqakm -cert -add -db mqtt.p12 -pw "passw0rd" -file mosquittoCert.pem
  6. Reinicie el canal MQTT .

Publicar con Mosquitto y autenticación mutua

Realice los pasos siguientes para publicar con Mosquitto utilizando la autenticación mutua.
  1. El mandato siguiente debe publicar correctamente un mensaje de prueba:
    mosquitto_pub -h 172.17.0.2 --cafile serverCert.pem --insecure -p 8883 -i mosquittoClient -t test -m 'test message' -d --cert mosquittoCert.pem --key mosquittoKey.pem
  2. El mandato siguiente no puede publicar un mensaje de prueba y generar un mensaje de error porque no envía un certificado personal desde Mosquitto:
    mosquitto_pub -h 172.17.0.2 --cafile serverCert.pem --insecure -p 8883 -i mosquittoClient -t test -m 'test message' -d /var/mqm/qmgrs/mqttDemoQM/errors/ mqxr_0.log