1

我正在尝试使用 libmosquitto 设置客户端。连接到代理就像一个魅力,有和没有 TLS。但是每当我尝试通过 TLS 连接发送数据时,我都会收到错误消息:

Blockquote 1486712210:OpenSSL 错误:错误:14094438:SSL 例程:ssl3_read_bytes:tlsv1 警报内部错误 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 连接正常工作)

有效的东西:

  • 使用端口 1883 运行代码(无 TLS)
  • 使用我使用generate-CA.sh 生成的 ca.crt、client.crt 和 client.key以及 mosquitto 文档中的信息运行 mosquitto_sub 和 mosquitto_pub

我很肯定,这只是一个小错误,我太缺乏经验,看不到它。希望你能帮忙。

提前谢谢了!

马蒂亚斯

4

1 回答 1

-1

您无法通过应用程序连接到 MQTT 代理,因为您可能正在使用 IP 地址连接到它,正如 BROKER_ADRESS 变量所暗示的那样。TLS 期望连接被定向到与在 client.csr 请求文件的生成步骤中使用的相同的 CN(通用名称)。如果您使用代理主机名 (werkstatt.logicway.net) 而不是普通地址,您应该能够连接到设备。

  • 如果未使用 SAN 扩展,则 CN(通用名称)应与服务器/代理主机名相同。

我有同样的问题,并从这里输入https://openest.io/en/2020/01/03/mqtts-how-to-use-mqtt-with-tls/帮助我。

于 2021-01-29T15:50:59.093 回答