0

Azure IoT-Hub に MQTT で接続し、Beaglebone black (OS: Debian Wheezy) から Paho C Client を使用してメッセージを送受信しようとしています。Ubuntu マシンで Eclipse CDT を使用してアプリケーションを開発し、リモートでデプロイ/デバッグしています。

ネイティブの ubuntu マシン (gcc でコンパイル) でアプリケーションを実行すると、Azure 接続が成功し、パケットを送信できます。

ここで指定されているように OPENSSL をクロスコンパイルし、適切なディレクトリを「/usr/arm-linux-gnueabihf」フォルダーにコピーしました。しかし、arm-linux-gnueabihf-gcc-4.7 でコンパイルし、beaglebone black (gdb-multiarch を使用) でリモート デバッグを実行すると、出力コンソールに次のエラーが表示されます。

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

この問題の解決にご協力ください。ありがとうございます。

編集: 疑わしいリンク - Reg:疑わしい重複リンクのエラーは同じですが、そこにある OPENSSL エラーは証明書の期限切れが原因です。しかし、私の場合は、azure & BBB との MQTT 接続中です。さらに、そのリンクには私の質問に対する答えがありません。そのリンクによると、SSL/TLS で保護された接続を選択した場合、証明書の検証を無効にしても意味がありません。

私のコード:

#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;
}
4

2 に答える 2

1

IoT Hub への接続に Azure IoT SDK の使用を検討したことはありますか? Debian は標準でサポートされており、接続を確立する際の複雑さが抽象化されています。SDK を使用する利点については、このブログを参照してください。

于 2017-11-30T19:17:03.903 に答える
0

問題を解決しました。
コマンドラインから .crt 形式でサーバー証明書を取得し、/usr/local/share/ca-certificates/ フォルダーに保存しました。

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

次に、トラスト ストア証明書を更新して、上記のダウンロードした証明書を追加しました。

update-ca-certificates

更新後、コードで ca-certificates ファイルを参照しましたが、

conn_opts.ssl->trustStore = "/etc/ssl/certs/ca-certificates.crt";
于 2016-06-28T09:37:06.103 に答える