使用libmosquitto的客户端使用TLS获取“tlsv1 alert internal error”,无需TLS即可正常工作

时间:2017-02-10 08:08:36

标签: c++ mqtt mosquitto libmosquitto

我正在尝试使用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连接正常工作)

有效的方法:

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

我非常积极,这只是一个小小的错误而且我只是缺乏经验而无法看到它。希望你能帮忙。

非常感谢提前!

的Mathias

1 个答案:

答案 0 :(得分:-1)

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

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

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