[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保护的代理,但是我想使设备通信更加安全。谢谢您的时间!
这里有两个独立的问题。
看起来您没有VPS的有效DNS条目。 mosquitto_pub
失败,因为它无法将名称解析为IP地址。它与--insecure
和IP地址一起使用,因为您要让mosquitto_pub
忽略以下事实:代理证书中的CN或SAN不仅包括IP地址(名称)。
您正在尝试通过TLS与原始MQTT而非MQTT进行连接,您需要使用的URL不只是主机名或connect()
函数的第一个参数。例如
this.mqttClient = mqtt.connect("mqtts://" + this.host, optionsz);
老实说,您需要同时修复这两个问题才能使工作正常。
要修复1,您需要对DNS条目进行排序,以便您拥有一个有效的标准主机名,该主机名指向您的VPS,并与您在那里部署的证书相匹配。