我正在尝试使用libmosquitto建立一个客户端。连接到代理就像魅力,有或没有TLS。但每当我尝试通过TLS连接发送数据时,我都会收到错误:
块引用 1486712210:OpenSSL错误:错误:14094438:SSL例程:ssl3_read_bytes:tlsv1 alert内部错误 1486712210:OpenSSL错误:错误:140940E5:SSL例程:ssl3_read_bytes:ssl握手失败 1486712210:客户端出现套接字错误,断开连接。 块引用
我从mosquitto的git资源库 mosquitto/test/lib/c/08-ssl-connect-cert-auth-enc.c 尝试了测试客户端,结果相同。
我当前的服务器配置:
listener 1883
listener 8883
cafile /etc/mosquitto/ca_certificates/ca.crt
certfile /etc/mosquitto/certs/werkstatt.logicway.net.crt
keyfile /etc/mosquitto/certs/werkstatt.logicway.net.key
require_certificate true
tls_version tlsv1
源代码:
#include <stdio.h>
#include <string.h>
#include <sstream>
#include <iostream>
#include <QtCore/QCoreApplication>
#include <QtDBus/QtDBus>
#include <mosquitto.h>
#include "logicgateway_data.h"
#include "logicgateway_client.h"
using namespace std;
const char *data_out;
struct mosquitto *mosq = NULL;
// BEschreibung kommt
int LGW_Client::receive_data(QString in_basket)
{
data_out = in_basket.QString::toLatin1();
cout << "Wert erhalten: " << data_out << endl;
mosquitto_publish(mosq,0,LGW_TOPIC,strlen(data_out),data_out,0,true);
return 0;
}
int main (int argc, char **argv)
{
// Verbindung mit der Qt-Dbus Session erstellen
QCoreApplication app(argc,argv);
if(!QDBusConnection::sessionBus().isConnected()){
fprintf(stderr,"Kann nicht mit D-Bus Session verbinden.\n"
"Um sie zu starten, geben Sie bitte ein:\n"
"\teval `dbus-launch --auto-syntax`\n");
return 1;
}
// Mosquitto initialisieren
mosquitto_lib_init();
mosq = mosquitto_new(CID,false,NULL);
if(!mosq)
{
printf("Nicht erstellt\n");
return 1;
}
else
{
printf("Mosquitto erfolgreich verbunden!\n");
}
// TLS Anbindung
if (LGW_PORT == 8883)
{
mosquitto_tls_opts_set(mosq,1,"tlsv1",NULL);
mosquitto_tls_set(mosq,"ca.crt",NULL,"client.crt","client.key", NULL);
}
// Mosquitto Verbindung zum Broker erstellen
if(mosquitto_connect(mosq,BROKER_ADRESS,LGW_PORT,60))
{
fprintf(stderr, "Fehler!\n");
return 1;
}
else
{
printf("Laeuft!\n");
}
// DBus Service registrieren um Daten zu empfangen
if(!QDBusConnection::sessionBus().registerService(SERVICE_NAME_CLIENT)) {
fprintf(stderr, "%s\n", qPrintable(QDBusConnection::sessionBus().lastError().message()));
exit(1);
}
printf ("LGW-Client: Gestartet...\n");
LGW_Client lgwclient;
QDBusConnection::sessionBus().registerObject("/",&lgwclient, QDBusConnection::ExportAllSlots);
app.exec();
// Fehlerbehandlung und aufräumen
//fprintf(stderr, "%s\n", qPrintable(QDBusConnection::sessionBus().lastError().message()));
mosquitto_loop_forever(mosq, -1, 1); //Bin mir nicht sicher, ob ich das hier wegen der While-Schleife brauche
mosquitto_destroy(mosq);
mosquitto_lib_cleanup();
return 1;
}
(对于一般的代码,请保持温和。我是一个血腥的初学者,并且充分意识到,还有很多需要改进的地方。但目前我只想让TLS连接正常工作)
有效的方法:
我非常积极,这只是一个小小的错误而且我只是缺乏经验而无法看到它。希望你能帮忙。
非常感谢提前!
的Mathias
答案 0 :(得分:-1)
您无法通过您的应用程序连接到 MQTT 代理,因为您可能正在使用 IP 地址连接到它,正如 BROKER_ADRESS 变量所建议的那样。 TLS 期望将连接定向到与 client.csr 请求文件的生成步骤中使用的 CN(通用名称)相同的 CN(通用名称)。如果您使用代理主机名 (werkstatt.logicway.net) 而不是普通地址,您应该能够连接到设备。
我遇到了同样的问题,请从这里输入https://openest.io/en/2020/01/03/mqtts-how-to-use-mqtt-with-tls/帮助我。