我已经找了几个小时了,试图找到这个问题的答案。
我想用nodejs(使用 mqtt.js 包)来连接到MQTT服务器。该服务器有一个CA签名的证书,我没有控制该服务器,但它被其他几个客户端使用。我没有控制该服务器,但它被其他几个客户端使用。当我使用windows应用程序MQTTBox时,我可以使用以下设置进行正常连接。
然而,当我尝试使用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,结果也是一样。