2016-10-13 184 views
2

我想用TLS使用下面的包来实现node.js mqtt客户端;node.js使用TLS的mqtt客户端

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

运行MQTT客户机不使用TLS的代码如下;

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 

回答

5

应该是足够的URL 部分更改为mqtts://

mqtts://test.mosquitto.org

自签名证书

可以使用自签名证书(仅用于测试目的)时,通过下列选项将connect功能:

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

这将无法正常工作,因为经纪人正在使用自签名证书,因此客户端不会相信它。 – hardillb

+1

@ user91579631使用自签名证书时,您可以传递'rejectUnauthorized:false'作为选项。编辑:我将信息添加到答案。 – notion

+0

似乎没有必要让客户知道经纪人使用的证书和密钥。谢谢。 – user781486

3

您需要提供mqtt.connect()功能与包含CA证书的选项对象用于验证连接。

选项对象需要包含指向用于签署代理证书的证书的ca密钥。由于它看起来像使用自签名证书,这将与经纪人使用的一样。

ca关键是描述here

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

+0

如何在选项中指定'ca'键?我找不到'ca'选项[https://www.npmjs.com/package/mqtt#client] – user3496167

+1

但它确实表示options对象也传递给'tls.connect()'所以它也可以包含任何这些选项。 – hardillb

+0

谢谢。我会试一试。 – user3496167