簡體   English   中英

使用 libmosquitto 的客戶端使用 TLS 獲取“tlsv1 警報內部錯誤”,在沒有 TLS 的情況下工作正常

[英]Client using libmosquitto gets "tlsv1 alert internal error" using TLS, works fine without TLS

我正在嘗試使用 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_sub 和 mosquitto_pub 以及來自 mosquitto 文檔的信息

我很肯定,這只是一個小錯誤,我太缺乏經驗了,看不到它。 希望你能幫忙。

提前謝謝了!

馬蒂亞斯

您無法通過您的應用程序連接到 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/幫助我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM