使用 TLS 认证的示例 MQTT 通道配置

此示例指导您完成配置使用 TLS 认证的 MQTT 通道的示例。 它在 MQTT 和 Mosquitto 之间配置了一个通道。

该示例为 Red Hat® Enterprise Linux® 上的 IBM® MQ 和 CentOS, 上的 Mosquitto 使用了 Docker 容器,但适用于任何类型的服务器。 (由于注册表权利,CentOS 已用于 Mosquitto。)

此示例假设您了解 MQ Telemetry 通道配置中描述的使用 TLS 进行通道身份验证的配置更改。

为单向 TLS 配置 IBM MQ 密钥库和通道

[MQ 9.4.0 2024 年 6 月][MQ 9.4.0 2024 年 6 月]重要:IBM MQ 9.4.0 开始,使用 SSL/TLS 的 AMQP 和 MQTT 信道不支持 CMS 密钥库和储藏文件。 使用 PKCS #12 密钥存储库,并改为使用 IBM MQ 密码保护系统来保护密钥存储库密码。
完成以下步骤:
  1. [MQ 9.4.0 2024 年 6 月][MQ 9.4.0 2024 年 6 月]创建 IBM MQ PKCS #12 密钥存储:
    runmqakm -keydb -create -db mqtt.p12 -pw "passw0rd" -type p12
  2. [MQ 9.4.0 2024 年 6 月][MQ 9.4.0 2024 年 6 月]创建个人证书:
    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
    您可以使用以下命令来确认创建证书:
    runmqakm -cert -list -v -db mqtt.p12 -pw "passw0rd"
  3. [MQ 9.4.0 2024 年 6 月][MQ 9.4.0 2024 年 6 月]在 runmqsc 提示符下输入以下命令,创建 MQTT 频道:
    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)
    请注意,该频道使用 Java 加密映射,请参阅 TLS CipherSpecs 和 CipherSuites 在 IBM MQ 类中为 JMS
  4. 抽取证书:
    runmqakm -cert -extract -db mqtt.p12 -pw "passw0rd" -label ibmwebspheremqmqm -target serverCert.pem

在 Docker 容器中的 CentOS 上安装蚊子

完成以下步骤,创建一个在 CentOS: 上运行 Mosquitto 的 Docker 容器

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

将签署者证书移动到 Mosquitto

完成以下步骤以将您在 IBM MQ 中创建的证书移至 Mosquitto。 这些步骤在 Docker 主机上运行。
  1. 查看 Docker上的容器标识:
    docker container ls
  2. 将文件从 Docker 容器复制到本地系统 Docker
    cp MQ_Container_ID:/var/mqm/mqtt/serverCert.pem serverCert.pem 
  3. 将文件从本地机器复制到 centOS 机器上的根目录:
    docker cp serverCert.pem CentOS_ContainerID:/serverCert.pem

使用 Mosquitto 发布

使用以下命令在 Mosquitto 上发布测试消息:
mosquitto_pub -h 172.17.0.2 --cafile serverCert.pem --insecure -p 8883 -i mosquittoClient -t test -m 'test message' -d
命令参数具有以下含义:
-h
Red Hat Enterprise Linux 主机 IP 地址 (可以使用 nslookup找到)。
--cafile
包含签署者证书的文件。
--insecure
指定此选项是因为示例正在使用自签名证书。 使用实际 CA 证书时,请勿使用此选项。
-p
端口号。
-i
客户机标识。
-t
要发布到的主题。
-m
正在发布的消息。
-d
启用调试消息。

配置 MQTT 通道以进行相互 TLS 认证

输入以下命令以将 MQTT 通道重新配置为 SSLCAUTH (必需)。

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

在 Mosquitto 服务器上创建密钥/证书对并添加到 IBM MQ

输入以下命令以在 Mosquitto 上创建密钥/证书对:

  1. 使用 openSSL 为 Mosquitto 创建密钥/证书对:
    openssl req -x509 -newkey rsa:4096 -keyout mosquittoKey.pem -out mosquittoCert.pem -subj "/CN=Mosquitto"
  2. 列出容器的容器标识:
    docker container ls
  3. 将 Mosquitto 证书复制到本地系统 Docker:
    docker cp CentOS_ContainerID:mosquittoCert.pem .
  4. 将 Mosquitto 证书复制到 IBM MQ:
    docker cp mosquittoCert.pem MQ_Container_ID:/var/mqm/mqtt
  5. 将证书添加到 IBM MQ 密钥库:
    runmqakm -cert -add -db mqtt.p12 -pw "passw0rd" -file mosquittoCert.pem
  6. 重新启动 MQTT 通道。

使用 Mosquitto 和相互认证发布

完成以下步骤以使用相互认证与 Mosquitto 一起发布。
  1. 以下命令应成功发布测试消息:
    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. 以下命令应该无法发布测试消息并生成错误消息,因为它不会从 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