gpt4 book ai didi

node.js - 通过 SSL/TLS 使用 Node mqtt 客户端连接到 mosquitto 代理时出现问题

转载 作者:太空宇宙 更新时间:2023-11-04 01:17:18 24 4
gpt4 key购买 nike

你好,我通过 eclipse docker 镜像创建了一个 mosquitto 代理,最近按照本指南添加了 SSL/TLS 支持:http://www.steves-internet-guide.com/mosquitto-tls/ .

当我在运行代理的 VPS 中进行 sshed 时,我可以使用以下命令:

mosquitto_pub -h VPS_NAME -t test/topic -p 8883 --cafile ca.crt -m message -u BROKER_USERNAME -P BROKER_PASSWORD

并且它发布了所有精美而花花公子的内容。但是,当我在本地计算机上运行相同的命令时,出现错误:

'Unable to connect (Lookup error.).

我没有从代理容器中获取任何新日志,因此我认为它甚至没有到达容器。但是当我运行时:

mosquitto_pub -h BROKER_IP_ADRESS -t test/topic -p 8883 --cafile ca.crt -m message -u BROKER_USERNAME -P BROKER_PASSWORD

我确实得到了一个响应,错误:发生了 TLS 错误,并且在我的 docker 日志中我得到:

1583004287: New connection from LOCAL_IP_ADDRESS on port 8883.
1583004287: OpenSSL Error: error:14037438:SSL routines:ACCEPT_SR_KEY_EXCH:tlsv1 alert internal error
1583004287: OpenSSL Error: error:140370E5:SSL routines:ACCEPT_SR_KEY_EXCH:ssl handshake failure
1583004287: Socket error on client <unknown>, disconnecting.

当我将 --insecure 命令添加到发布中时,我只能获得成功的发布发送,但是我想确保客户端知道它正在与正确的服务器通信,所以我认为这是不正确的解决方案。

最后我想在 Node 应用程序上运行mqtt客户端,我尝试了这段代码:


const fs = require('fs');

const optionsz = {
ca: [ fs.readFileSync(__dirname + '/ca.pem') ],
host: 'BROKER_IP_ADDRESS',
servername: 'VPS_NAME',
port: 8883,
rejectUnauthorized : false,
username : 'BROKER_USERNAME', // mqtt credentials if these are needed to connect
password : 'BROKER_PASSWORD',
clientId : 'test',
// Necessary only if the server's cert isn't for "localhost".
checkServerIdentity: () => { return null; },
};


class MqttHandler {
constructor() {
this.mqttClient = null;

};


connect() {
// Connect mqtt with credentials (in case of needed, otherwise we can omit 2nd param)
this.mqttClient = mqtt.connect(this.host, optionsz);
...

当我运行这个时,我不断收到断开连接事件,并且在我的 Docker 日志中我得到:

1583004505: New connection from LOCAL_IP_ADDRESS on port 8883.
1583004505: OpenSSL Error: error:140260FC:SSL routines:ACCEPT_SR_CLNT_HELLO:unknown protocol
1583004505: Socket error on client <unknown>, disconnecting.

我真的很困惑如何解决这个问题,我已经能够连接到没有 SSL/TLS 保护的代理,但我想让我的设备通信更加安全。感谢您的宝贵时间!

最佳答案

这里有两个独立的问题。

  1. 您的 VPS 似乎没有有效的 DNS 条目。 mosquitto_pub 失败,因为它无法将名称解析为 IP 地址。它适用于 --insecure 和 IP 地址,因为您告诉 mosquitto_pub 忽略代理证书中的 CN 或 SAN 不包含 IP 地址而仅包含名称这一事实。

  2. 您正在尝试连接原始 MQTT,而不是通过 TLS 的 MQTT,您需要使用 URL,而不仅仅是主机名或 connect() 函数的第一个参数。例如

    this.mqttClient = mqtt.connect("mqtts://" + this.host, optionsz);

说实话,您需要修复这两个问题才能使事情正常工作。

要修复 1,您需要对 DNS 条目进行排序,以便拥有指向您的 VPS 并与您在那里部署的证书相匹配的有效完全限定主机名。

关于node.js - 通过 SSL/TLS 使用 Node mqtt 客户端连接到 mosquitto 代理时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60468951/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com