如何使用mqtt.js连接到CA签名的MQTT服务器?

问题描述 投票:0回答:1

我已经找了几个小时了,试图找到这个问题的答案。

我想用nodejs(使用 mqtt.js 包)来连接到MQTT服务器。该服务器有一个CA签名的证书,我没有控制该服务器,但它被其他几个客户端使用。我没有控制该服务器,但它被其他几个客户端使用。当我使用windows应用程序MQTTBox时,我可以使用以下设置进行正常连接。

MQTTBox Settings

然而,当我尝试使用nodejs(mqtt.js)来做这件事时,我得到的错误似乎与证书有关。

以下是我试图使用nodejs连接的简化代码。

import mqtt from 'mqtt';
import tls from 'tls';

const options = tls.connect({
  host: 'mqtt.<domain>',
  port: 9883,
  username: '<username>',
  password: '<password>',
});

const client = mqtt.connect('mqtts://mqtt.<domain>:9883', options);
client.on('connected', () => {
  console.log('Connected!');
});
client.on('error', (error) => {
  console.log('Error:', error);
});

这给了我:

> Error: unable to verify the first certificate
>     at TLSSocket.onConnectSecure (_tls_wrap.js:1473:34)
>     at TLSSocket.emit (events.js:311:20)
>     at TLSSocket.EventEmitter.emit (domain.js:482:12)
>     at TLSSocket._finishInit (_tls_wrap.js:916:8)
>     at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:686:12)
> Emitted 'error' event on TLSSocket instance at:
>     at emitErrorNT (internal/streams/destroy.js:92:8)
>     at emitErrorAndCloseNT (internal/streams/destroy.js:60:3)
>     at processTicksAndRejections (internal/process/task_queues.js:84:21) {
>   code: 'UNABLE_TO_VERIFY_LEAF_SIGNATURE'
> }

是否有其他的设置,我应该用它来表明服务器有一个CA签名的证书?我以为只要服务器有证书就很简单,也许我漏掉了一些明显的东西。

更新

监听器应该命名为 "connect",而不是 "connecting"。正如hardillb在上面的评论中所指出的,选项对象不应该通过tls.connect()手动传递,它是由mqtt.js完成的(只是我试了一下,忘了删除)。

这些改动后,我们就剩下了。

import mqtt from 'mqtt';

const options = {
  host: 'mqtt.<domain>',
  port: 9883,
  username: '<username>',
  password: '<password>',
};

const client = mqtt.connect('mqtts://mqtt.<domain>:9883', options);
client.on('connect', () => {
  console.log('Connected!');
});
client.on('error', (error) => {
  console.log('Error:', error);
});

这也是,反复地,给出以下错误。

> Error: Error: unable to verify the first certificate
>     at TLSSocket.onConnectSecure (_tls_wrap.js:1473:34)
>     at TLSSocket.emit (events.js:311:20)
>     at TLSSocket.EventEmitter.emit (domain.js:482:12)
>     at TLSSocket._finishInit (_tls_wrap.js:916:8)
>     at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:686:12) {
>   code: 'UNABLE_TO_VERIFY_LEAF_SIGNATURE'
> }
> Error: Error: unable to verify the first certificate
>     at TLSSocket.onConnectSecure (_tls_wrap.js:1473:34)
>     at TLSSocket.emit (events.js:311:20)
>     at TLSSocket.EventEmitter.emit (domain.js:482:12)
>     at TLSSocket._finishInit (_tls_wrap.js:916:8)
>     at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:686:12) {
>   code: 'UNABLE_TO_VERIFY_LEAF_SIGNATURE'
> }
...

如果我添加 rejectUnauthorized: false 到选项中,它的工作原理是这样的。我很确定服务器的CA是Letencrypt,难道node认为这不安全吗?

我坐在windows 10的机器上,原来用的是nodejs v12.16.1,现在更新到了v12.18.0,结果也是一样。

node.js ssl mqtt
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.