2016-06-22 46 views
0

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

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

私はOPENSSLを指定した通りhereとしてクロスコンパイルし、 "/ usr/arm-linux-gnueabihf"フォルダに適切なディレクトリをコピーしました。しかし、私は(GDB-multiarch付)私のbeagleboneブラック上アームのlinux-gnueabihf-GCC-4.7およびリモートデバッグでコンパイルしたときに私は私の出力コンソールに次のエラーを取得しています:

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:重複疑いのあるエラーlinkは同じですが、期限切れの証明書が原因で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; 
} 
+0

これらのエラーは実行時です。私はこれらのエラーに遭遇しましたが、私にとってはSSLの証明書を確認できませんでした。 Chromeのようなブラウザからこれらのサービスにアクセスできるかどうかはわかりませんが、可能であれば、Chromeが証明書について同じ警告を出すかどうかを確認できます。 – bzeaman

+0

[SSLエラー:ルーチン:SSL3 \ _GET \ _SERVER \ _CERTIFICATE:証明書の検証に失敗しました]の重複している可能性があります(http://stackoverflow.com/questions/17084886/ssl-error-routinesssl3-get-server-certificatecertificate-verify-failed ) – bzeaman

+0

@bzeamanはい。実行時にエラーが発生します。これはTCP経由のMQTTブローカーなので、ブラウザからこれらのサービスにアクセスすることはできません。しかし、私はgccでubuntuに構築された同じコードを検証し、正常にAzureに接続しました。私の質問は重複していると疑われていたので私の投稿編集を見て、そのリンクは私の問題に答えることはできません。 – Manoj

答えて

0

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

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

その後、私は

update-ca-certificates 

私は私のコードでCA-証明書ファイルを参照さ更新した後、

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

はあなたを持って、上記ダウンロードした証明書を追加するには、トラストストアの証明書を更新IoTハブへの接続にAzure IoT SDKを使用すると考えられていましたか? Debianはすぐに利用でき、接続を確立する上での複雑さは抽象化されています。このblogを読むと、SDKを使用するメリットが得られます。

関連する問題