2016-06-22 14 views
0

Ich versuche, mit Azure IoT-Hub mit MQTT zu verbinden und Nachrichten mit Paho C Client von Beaglebone schwarz (OS: Debian Wheezy) zu senden und zu empfangen. Ich benutze Eclipse CDT auf Ubuntu-Maschine, um meine Anwendung zu entwickeln und remote zu implementieren/debuggen.Paho MQTT C Clientverbindung mit azurem IoT-Hub auf Beaglebone Schwarz

Wenn ich die Anwendung auf meinem nativen Ubuntu-Rechner (Kompiliert mit gcc), Azure-Verbindung ist erfolgreich und ich bin in der Lage, Pakete zu senden.

Ich übersetzte die OPENSSL wie angegeben here und kopierte die entsprechenden Verzeichnisse im Ordner "/ usr/arm-linux-gnueabihf". Aber wenn ich mit dem Arm-linux-gnueabihf-gcc-4.7 und Remote-Debug auf meinem BeagleBone schwarz kompilieren (mit GDB-multiarch) ich erhalte den folgenden Fehler in meiner Ausgabekonsole:

3068126320:error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed:s3_clnt.c:1185: 
3068126320:error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed:s3_clnt.c:1185: 
Failed to connect, return code -1 

Bitte helfen Sie mir behebe dieses Problem.Vielen Dank.

Edit: Mutmaßliche Link - Reg: Der Fehler in den vermuteten doppelten link gleichen, aber die OPENSSL Fehlern dort abgelaufen Zertifikat fällig. Aber in meinem Fall ist es während MQTT Verbindung mit azurblauen & BBB. Und außerdem gibt es keine Antwort auf meine Frage in diesem Link. Gemäß diesem Link hat es keinen Sinn, die Zertifikatsüberprüfung zu deaktivieren, wenn wir uns für eine sichere SSL/TLS-Verbindung entscheiden.

Mein Code:

#include "stdio.h" 
#include "stdlib.h" 
#include "string.h" 
#include "MQTTClient.h" 
#define PAYLOAD  "Hello World!" 
#define QOS   1 
#define TIMEOUT  10000L 
#define TOPIC1  "devices/Manoj_Test/messages/events/" 
#define ADDRESS  "ssl://xxxxxxxx.azure-devices.net:8883" 
#define CLIENTID1 "Manoj_Test" 

int main(void) 
{ 
MQTTClient client; 
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer; 
MQTTClient_message pubmsg = MQTTClient_message_initializer; 
MQTTClient_deliveryToken token; 
int rc1; 

MQTTClient_create(&client, ADDRESS, CLIENTID1, 1, NULL); 
conn_opts.cleansession = 1; 
conn_opts.username = "xxxxxxxx.azure-devices.net/Manoj_Test"; 
conn_opts.password = "SharedAccessSignature sr=xxxxxxxx.azure-devices.net%2fdevices%2fManoj_Test&sig=GyizT%2b7uyIpOkMJjTfN%2fpOZh9CnuQedNB%2bre2NrL1Kg%3d&se=1496395529"; 


MQTTClient_setCallbacks(client, NULL, connlost, msgarrvd, delivered); 


if ((rc1 = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) 
{ 
    printf("Failed to connect, return code %d\n", rc1); 
    exit(-1); 
} 

MQTTClient_subscribe(client, TOPIC, QOS); 
while(1) 
{ 
    pubmsg.payload = PAYLOAD; 
    pubmsg.payloadlen = strlen(PAYLOAD); 
    pubmsg.qos = 1; 
    pubmsg.retained = 0; 
    MQTTClient_publishMessage(client, TOPIC1, &pubmsg, &token); 
    printf("Waiting for up to %d seconds for publication of %s\non topic %s for client with ClientID: %s\n", (int)(TIMEOUT/1000), PAYLOAD, TOPIC1, CLIENTID1); 
    rc1 = MQTTClient_waitForCompletion(client, token, TIMEOUT); 
    printf("Message with delivery token %d delivered\n", token); 
    usleep(100000); 
} 
MQTTClient_disconnect(client, 10000); 
MQTTClient_destroy(&client); 
return rc1; 
} 
+0

Diese Fehler sind Laufzeit, oder? Ich bin auch auf diese Fehler gestoßen und für mich bedeutete es, was es sagte: Es konnte das SSL-Zertifikat nicht verifizieren. Ich bin mir nicht sicher, ob Sie diese Dienste über einen Browser wie Chrome erreichen können, aber wenn Sie können, können Sie überprüfen, ob Chrome Ihnen die gleiche Warnung über das Zertifikat gibt. – bzeaman

+0

Mögliches Duplikat von [SSL-Fehler: Routinen: SSL3 \ _GET \ _SERVER \ _CERTIFICATE: Zertifikatprüfung fehlgeschlagen] (http://stackoverflow.com/questions/17084886/ssl-error-routinesssl3-get-server-certificatecertificate-verify-failed) – bzeaman

+0

@bzeaman Yup. Die Fehler sind während der Laufzeit. Ich kann diese Dienste nicht vom Browser aus erreichen, da dies ein MQTT-Broker über TCP ist. Aber ich habe den gleichen Code validiert, der auf ubuntu mit gcc erstellt wurde, und erfolgreich mit Azure verbunden. Und für meine Frage verdächtig als Duplikat siehe meine Nachbearbeitung, und dieser Link beantwortet mein Problem nicht. – Manoj

Antwort

0

beschloß ich, das Problem.
Ich habe das Serverzertifikat von der Befehlszeile im .crt-Format erhalten und im Ordner/usr/local/share/ca-certificates/gespeichert.

openssl s_client -showcerts -connect server.edu:443 </dev/null 2>/dev/null|openssl x509 -outform DER >mycertfile.crt 

Dann aktualisiert ich die Trust Store-Zertifikate die oben heruntergeladenen Zertifikat hinzuzufügen,

update-ca-certificates 

Nach der Aktualisierung i die ca-Zertifikate-Datei in meinem Code refered,

conn_opts.ssl->trustStore = "/etc/ssl/certs/ca-certificates.crt"; 
1

Haben Sie In Betracht gezogen, Azure IoT SDKs für die Verbindung mit IoT Hub zu verwenden? Debian wird out-of-box unterstützt und die Komplexität beim Aufbau der Verbindung wird abstrahiert. Sie können diese blog für die Vorteile der Verwendung der SDKs lesen.

Verwandte Themen