Я пытаюсь настроить клиента с помощью libmosquitto. Подключение к брокеру работает как шарм, с TLS и без него. Но всякий раз, когда я пытаюсь отправить данные через соединение TLS, я получаю сообщение об ошибке:
Blockquote
1486712210: ошибка OpenSSL: ошибка: 14094438: подпрограммы SSL: ssl3_read_bytes: внутренняя ошибка предупреждения tlsv1
1486712210: ошибка OpenSSL: ошибка: 140940E5: процедуры SSL: ssl3_read_bytes: сбой рукопожатия ssl
1486712210: Ошибка сокета на клиенте, отключение.
Blockquote
Я попробовал тестовый клиент из Git-репозитория Mosquitto, mosquitto / тест / Библиотека / с / 08-SSL-подключения-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
Задача ещё не решена.
Других решений пока нет …