node.js 使用 TLS 的 mqtt 客户端

node.js mqtt client using TLS

我正在尝试使用下面的包实现 node.js mqtt 客户端和 TLS;

https://www.npmjs.com/package/mqtt#client

运行没有TLS的ning mqtt客户端代码如下;

var mqtt = require('mqtt')
var client  = mqtt.connect('mqtt://test.mosquitto.org')

client.on('connect', function () {
  client.subscribe('presence')
  client.publish('presence', 'Hello mqtt')
})

client.on('message', function (topic, message) {
  // message is Buffer 
  console.log(message.toString())
  client.end()
})

上面的代码应该如何修改才能在mqtt客户端使用TLS?

mosca MQTT 代理 运行 作为独立使用以下命令;

mosca --key ./tls-key.pem --cert ./tls-cert.pem --http-port 3000 --http-bundle --http-static ./ | pino

应该足以将 URL 的 protocol 部分更改为 mqtts://

mqtts://test.mosquitto.org.

自签名证书

您可以在使用自签名证书时将以下选项传递给 connect 函数(仅用于测试目的):

mqtt.connect('mqtts://test.mosquitto.org', {
    rejectUnauthorized: false
});

您需要为 mqtt.connect() 函数提供一个选项对象,其中包含用于验证连接的 CA 证书。

选项对象需要包含一个 ca 密钥,该密钥指向用于签署代理证书的证书。看起来您使用的是自签名证书,这与经纪人使用的证书相同。

ca键描述here

或者您可以使用@notion 的回答中提到的 rejectUnauthorized 密钥允许任何证书。但这使得无法检测是否有人在冒充您的经纪人