2016-10-13 135 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