使用TLS的Node.js MQTT客户端

10
我将尝试使用以下软件包实现基于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
2个回答

13

只需要将URL的protocol部分更改为mqtts://

mqtts://test.mosquitto.org.

自签名证书

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

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

这不会起作用,因为代理使用的是自签名证书,所以客户端不知道是否可信。 - hardillb
1
当使用自签名证书时,您可以将rejectUnauthorized: false作为选项传递。编辑:我已将此信息添加到答案中。 - notion
似乎客户端不需要知道经纪人使用的证书和密钥。谢谢。 - guagay_wk
@user91579631 客户端应该知道签署经纪人证书的任何证书(自签名时相同),否则就无法知道是否有其他人正在冒充它。 - hardillb

6
你需要向 mqtt.connect() 函数提供一个选项对象,其中包含用于验证连接的 CA 证书。
选项对象需要包括一个指向签署代理证书的证书的 ca 键。由于看起来你在使用自签名证书,因此这将是代理使用的相同证书。 ca 键在 这里 描述。
或者,你可以使用 @notion 的答案中提到的 rejectUnauthorized 键允许任何证书。但这将使检测是否有人冒充你的代理变得不可能。

我该如何在选项中指定“ca”密钥?我在这里找不到“ca”选项(https://www.npmjs.com/package/mqtt#client)。 - user3496167
1
但它确实说选项对象也传递给了 tls.connect(),所以它也可以包含那些选项。 - hardillb
谢谢。我会尝试一下。 - user3496167

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接