node.js使用TLS的mqtt客户端
我想用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
应该是足够的URL 部分更改为mqtts://
mqtts://test.mosquitto.org
。
自签名证书
可以使用自签名证书(仅用于测试目的)时,通过下列选项将connect
功能:
mqtt.connect('mqtts://test.mosquitto.org', {
rejectUnauthorized: false
});
您需要提供mqtt.connect()
功能与包含CA证书的选项对象用于验证连接。
选项对象需要包含指向用于签署代理证书的证书的ca
密钥。由于它看起来像使用自签名证书,这将与经纪人使用的一样。
的ca
关键是描述here
或者你可以允许与在@概念的回答中提到的rejectUnauthorized
密钥的任何证书。但是,这使得无法检测到有人冒充你的经纪人
如何在选项中指定'ca'键?我找不到'ca'选项[https://www.npmjs.com/package/mqtt#client] – user3496167
但它确实表示options对象也传递给'tls.connect()'所以它也可以包含任何这些选项。 – hardillb
谢谢。我会试一试。 – user3496167
这将无法正常工作,因为经纪人正在使用自签名证书,因此客户端不会相信它。 – hardillb
@ user91579631使用自签名证书时,您可以传递'rejectUnauthorized:false'作为选项。编辑:我将信息添加到答案。 – notion
似乎没有必要让客户知道经纪人使用的证书和密钥。谢谢。 – user781486