问题通过SSL / TLS通过节点mqtt客户端连接到mosquitto代理

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

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

当我掉入运行代理的VPS中时,可以使用以下命令:

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命令添加到发布时才能够成功发送发布,但是我想确保客户端知道它正在与正确的服务器通信,所以我认为这不是正确的解决方案。

最后,我想在节点应用程序上运行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保护的代理,但是我想使设备通信更加安全。谢谢您的时间!

node.js ssl mqtt
1个回答
0
投票

这里有两个独立的问题。

  1. 看起来您没有VPS的有效DNS条目。 mosquitto_pub失败,因为它无法将名称解析为IP地址。它与--insecure和IP地址一起使用,因为您要让mosquitto_pub忽略以下事实:代理证书中的CN或SAN不仅包括IP地址(名称)。

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

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

老实说,您需要同时修复这两个问题才能使工作正常。

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

© www.soinside.com 2019 - 2024. All rights reserved.