使用 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 月]](ng940.gif)
![[MQ 9.4.0 2024 年 6 月]](ng940cd.gif)
完成以下步骤:
创建 IBM MQ PKCS #12 密钥存储:
runmqakm -keydb -create -db mqtt.p12 -pw "passw0rd" -type p12
创建个人证书:
您可以使用以下命令来确认创建证书: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"
在 runmqsc 提示符下输入以下命令,创建 MQTT 频道:
请注意,该频道使用 Java 加密映射,请参阅 TLS CipherSpecs 和 CipherSuites 在 IBM MQ 类中为 JMS 。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)
- 抽取证书:
runmqakm -cert -extract -db mqtt.p12 -pw "passw0rd" -label ibmwebspheremqmqm -target serverCert.pem
在 Docker 容器中的 CentOS 上安装蚊子
完成以下步骤,创建一个在 CentOS: 上运行 Mosquitto 的 Docker 容器
docker pull centos
docker run -it centos /bin/bash
dnf -y install epel-release
dnf -y install mosquitto
将签署者证书移动到 Mosquitto
完成以下步骤以将您在 IBM MQ 中创建的证书移至 Mosquitto。 这些步骤在 Docker 主机上运行。
- 查看 Docker上的容器标识:
docker container ls
- 将文件从 Docker 容器复制到本地系统 Docker
cp MQ_Container_ID:/var/mqm/mqtt/serverCert.pem serverCert.pem
- 将文件从本地机器复制到 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 上创建密钥/证书对:
- 使用 openSSL 为 Mosquitto 创建密钥/证书对:
openssl req -x509 -newkey rsa:4096 -keyout mosquittoKey.pem -out mosquittoCert.pem -subj "/CN=Mosquitto"
- 列出容器的容器标识:
docker container ls
- 将 Mosquitto 证书复制到本地系统 Docker:
docker cp CentOS_ContainerID:mosquittoCert.pem .
- 将 Mosquitto 证书复制到 IBM MQ:
docker cp mosquittoCert.pem MQ_Container_ID:/var/mqm/mqtt
- 将证书添加到 IBM MQ 密钥库:
runmqakm -cert -add -db mqtt.p12 -pw "passw0rd" -file mosquittoCert.pem
- 重新启动 MQTT 通道。
使用 Mosquitto 和相互认证发布
完成以下步骤以使用相互认证与 Mosquitto 一起发布。
- 以下命令应成功发布测试消息:
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
- 以下命令应该无法发布测试消息并生成错误消息,因为它不会从 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