如何配置HiveMQ客户端的serverHost、serverPort及sslConfig以SSL连接8883端口?
问题背景
查阅了相关文档及所有能找到的示例,都没发现HiveMQ客户端通过SSL连接8883端口的简易示例。在Android上用HiveMQ客户端连接test.mosquitto.org的1883非安全端口十分简单,但使用该平台生成的凭证尝试连接8883安全端口时失败,出现如下日志:
MacAddressUtil com.example.tryhive W Failed to find a usable hardware address from the network interfaces; using random bytes: f4:51:aa:f9:c6:c8:9d:fa
客户端创建代码如下(仅遵循简易示例编写):
mqttClient = MqttClient.builder() .useMqttVersion3() .identifier("MyID") .serverHost("test.mosquitto.org") .serverPort(8883) .sslConfig() .keyManagerFactory(managers.kmf) .trustManagerFactory(managers.tmf) .applySslConfig() .buildAsync()
注:用于构建密钥管理器工厂(KeyManagerFactory)和信任管理器工厂(TrustManagerFactory)的凭证,在另一款使用Paho MqttAndroidClient的Android应用中可以成功建立TLS连接——是否需要附上这部分构建代码?
已尝试的错误操作及结果
- 尝试使用Paho客户端风格的
serverHost格式:
此操作导致Netty抛出异常。.serverHost("ssl://test.mosquitto.org") .serverPort(8883) - 首次运行非安全客户端时,误保留了Paho客户端使用的URI格式:
同样连接失败,且出现上述相同的MacAddressUtil日志。.serverHost("tcp://test.mosquitto.org") .serverPort(1883)
基于以上情况,我怀疑问题并非出在密钥/信任管理器的实现上,希望能获取可用的HiveMQ SSL连接示例代码,或是相关的使用经验。
更新(2022/12/05)
Netty版本排查:怀疑是Netty版本问题,尝试升级到最新版4.1.85.Final,依赖配置如下:
dependencies { implementation 'com.hivemq:hivemq-mqtt-client:1.3.0' implementation(platform("io.netty:netty-bom:4.1.85.Final")) }升级后仍无法连接mosquitto的任何安全端口:8883、8884、8885。
WebSocket连接尝试:尝试通过WebSocket接口连接,添加依赖:
implementation 'com.hivemq:hivemq-mqtt-client-websocket:1.3.0'客户端构建时添加
.webSocketWithDefaultConfig(),可以正常连接mosquitto的8080非安全端口(无需配置sslConfig),但启用SSL后连接8081、8090、8091安全端口均失败。
再次确认:密钥和信任管理器的构建代码与Paho客户端完全一致,且Paho客户端能成功建立安全连接,因此问题应该不在这部分实现上。
内容的提问来源于stack exchange,提问作者Scott Lohr

