【问题标题】:node.js mqtt client using TLS使用 TLS 的 node.js mqtt 客户端
【发布时间】:2017-02-22 10:45:08
【问题描述】:

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

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

不带TLS运行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

【问题讨论】:

    标签: node.js ssl mqtt tls1.2 mosca


    【解决方案1】:

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

    mqtts://test.mosquitto.org.

    自签名证书

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

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

    【讨论】:

    • 这行不通,因为代理使用的是自签名证书,因此客户端不知道信任它。
    • @user91579631 使用自签名证书时,您可以通过rejectUnauthorized: false 作为选项。编辑:我在答案中添加了信息。
    • 似乎客户端不需要知道代理使用的证书和密钥。谢谢。
    • @user91579631 客户应该知道曾经签署过经纪人证书的证书(自签名时也是如此),否则无法知道是否有其他人在冒充它。
    【解决方案2】:

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

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

    ca 键被描述为here

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

    【讨论】:

    • 如何在选项中指定ca 键?我找不到ca 选项here
    • 但它确实说选项对象也传递给tls.connect(),因此它也可以包含任何这些选项。
    • 谢谢。我会试一试的。
    猜你喜欢
    • 2021-03-15
    • 2018-01-05
    • 2012-09-12
    • 2022-01-02
    • 2013-09-24
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 2011-06-29
    相关资源
    最近更新 更多