MQTT (Message Queuing Telemetry Transport) ゲートウェイを使用してデバイスをIoT Platformに接続する場合、カスタム証明書を使用してデバイスIDを検証できます。 次に、証明書の共通名 (CN) を使用してデバイスを登録できます。 このトピックでは、MQTTゲートウェイを使用してデバイスをIoT Platformに接続する方法について説明します。 このトピックでは、デバイスIDを検証する例としてAlibaba Cloud Function Computeを使用します。
使用状況ノート
このトピックでは、共通ユーザーの権限を使用してすべての操作を実行します。 管理者権限を必要とする特定の操作を実行する場合は、sudoコマンドを実行します。
前提条件
Exclusive Enterprise Editionインスタンスが購入されました。 この例では、Exclusive Enterprise Editionインスタンスが中国 (上海) リージョンで購入されています。 詳細については、「Enterprise Editionインスタンスの購入」をご参照ください。
背景情報
IoT PlatformのMQTTゲートウェイを使用すると、Function Compute、カスタム証明書、OCSP、およびカスタムトピックのサードパーティ検証を使用して、デバイスを検証してIoT Platformに接続し、通信を可能にします。 これにより、複数のIoTビジネスシナリオを実装できます。
MQTTゲートウェイとデバイス間の検証と通信の詳細については、「MQTTゲートウェイ」をご参照ください。
準備
この例では、Ubuntu 22.04を開発環境として使用しています。
手順1: カスタム証明書の生成
Ubuntuにログインします。
次のコマンドを実行して、デバイスとサーバー用に
root-ca.crtという名前のルート証明書ファイルを生成します。openssl req \ -新しい \ -newkey rsa:2048 \ -日365 \ -ノード \ -x509 \ -subj "/C=CN/O=Aliyun IOT/CN=IoT CA" \ -keyout root-ca.key \ -outルート-ca.crtroot-ca.crtルート証明書ファイルに基づいて、カスタムサーバー側証明書を作成します。次のコマンドを実行して、
server.keyという名前のサーバー側キーファイルを生成します。openssl genrsa -out server.key 2048touch openssl.cn fコマンドを実行し、openssl.cn fという名前のファイルを作成します。vi openssl.cn fコマンドを実行してopenssl.cn fファイルを開き、次のコードをファイルにコピーし、Escキーを押して:wqと入力し、enterキーを押してファイルを保存します。[policy_match] countryName = cn stateOrProvinceName=オプション organizationName=オプション organizationalUnitName=オプション commonName=指定された emailAddress=オプション [req] default_bits = 2048 distinguidied_name=req_distinguidied_name req_extensions = req_ext x509_extensions = v3_req prompt = no [req_distingusingied_name] commonName=サーバー [req_ext] subjectAltName = @ alt_names [v3_req] subjectAltName = @ alt_names [alt_names] DNS.1 = * .mqtt.iothub.aliyuncs.com DNS.2 = * .igw.iothub.aliyuncs.com次のコマンドを実行して、
server.csrという名前のサーバー側リクエストファイルを生成します。openssl req -new -key server.key -config openssl.cn f -out server.csr次のコマンドを実行して、
server.crtという名前のサーバー側証明書ファイルを生成します。openssl x509 -req -days 365 -sha256 -in server.csr -CA root-ca.crt -CAkey root-ca.key-CAAcreateserial-out server.crt -extensions v3_req -extfile openssl.cn f次のコマンドを実行して、サーバー側証明書を確認します。
openssl verify -CAfile root-ca.crt server.crt
root-ca.crtルート証明書ファイルに基づいてデバイス側証明書を作成します。次のコマンドを実行して、
client.keyという名前のデバイス側キーファイルを生成します。openssl genrsa -out client.key 2048次のコマンドを実行して、
client.csrという名前のデバイス側リクエストファイルを生成し、CNパラメーターをClient_123に設定します。openssl req -new -key client.key -out client.csr -subj "/CN=Client_123"次のコマンドを実行して、
client.crtという名前のデバイス側証明書ファイルを生成します。openssl x509 -req -days 365 -sha256 -in client.csr -CA root-ca.crt -CAkey root-ca.key -CAcreateserial -out client.crt次のコマンドを実行して、デバイス側の証明書を確認します。
openssl verify -CAfile root-ca.crt client.crt
次の図は、生成されるカスタム証明書ファイルを示しています。

ステップ2: Function Compute関数を作成してデバイスを検証する
上部のナビゲーションバーで、リージョンを選択します。 [サービス] ページで、[サービスの作成] をクリックします。
[サービスの作成] パネルで、サービス名を入力します。 例: IoT_Service [OK] をクリックします。
[関数] ページで、[関数の作成] をクリックします。
次の図に示すように、[関数の作成] ページでパラメーターを設定し、[作成] をクリックします。

[関数の詳細] ページで、既存のサンプルコードを次のコードに置き換え、[デプロイ] をクリックします。
検証関数は、デバイス側証明書のCNをdeviceNameパラメーターの値として返します。
# -*-コーディング: utf-8 -*- インポートロギング jsonのインポート インポート時間 enumのインポート ランダムにインポート インポート文字列 クラスの要求: def __init__(self, json_str): self.clientId=なし self.us ername=なし self.password=なし self.certificateCommonName=なし キーに対して、json.loads(json_str).items() の値: setattr(self, key, value) クラスの応答: def __init__(self): self.de viceName=なし self.result = 'true' self.message = 'success' defハンドラー (self, request): # deviceNameパラメーターの値として、デバイス側証明書のCNを返します。 self.de viceName = request.certificateCommonName を返すjson.dumps(self.__dict__) def handler (イベント、コンテキスト): request = Request (イベント) return Response().handler(request)
ステップ3: ゲートウェイの作成
[概要] ページで、Exclusive Enterprise Editionインスタンスのカードをクリックします。
左側のナビゲーションウィンドウで、[デバイス]> [ゲートウェイ] を選択します。 [ゲートウェイ] ページで、[ゲートウェイの追加] をクリックします。
[ゲートウェイの追加] ダイアログボックスで、次のパラメーターを設定し、[OK] をクリックします。
サーバー証明書パラメーターを
Server. crtファイルの内容に、サーバー証明書の秘密鍵パラメーターをserver. Keyファイルの内容に、デバイスルート証明書パラメーターをRoot-ca.crtファイルの内容に設定します。 パラメーターの詳細については、「ゲートウェイの作成」をご参照ください。
[ゲートウェイ] ページで、ゲートウェイの [ゲートウェイURL] 列のURLをコピーします。

ステップ4: デバイス側プログラムの開発
Ubuntuに行きます。
次のコマンドを実行して依存関係をインストールします。
sudo apt-get install build-essential gcc make cmake cmake-gui cmake-curses-gui sudo apt-getインストールlibssl-dev次のコマンドを実行して、オープンソースのPaho MQTTライブラリをインストールします。
git clone https://github.com/eclipse/paho.mqtt.c.git mkdir build&cd build cmake。./paho.mqtt.c -DPAHO_WITH_SSL=TRUE -DCMAKE_INSTALL_PREFIX="/usr/lib" make -j sudo make install && cd ..touch aiot_mqtt_demo.cコマンドを実行して、aiot_mqtt_demo.cという名前のデバイスシミュレータファイルを作成します。vi aiot_mqtt_demo.cコマンドを実行してファイルを開きます。 次のコードをファイルにコピーします。#include <stdio.h> # include <stdlib.h> # include <string.h> # include <unistd.h> # 「MQTTClient.h」を含める int msgarrvd(void * context, char * topicName, int topicLen, MQTTClient_message * message) { printf("message recv < topic [% s], payload [% s]\n", topicName, (char *)message->payload); MQTTClient_freeMessage(&メッセージ); MQTTClient_free(topicName); リターン1; } int main(int argc, char * argv[]) { MQTTClientクライアント; MQTTClient_connectOptions conn_opts=MQTTClient_connectionOptions_initializer; MQTTClient_SSLToptions ssl_opts = MQTTClient_SSLOptions_initializer; int rc; /* MQTTクライアントを作成します。 情報を実際の情報に置き換えます。 */ const char * host = "ssl:// iot-0 **** .igw.iothub.aliyuncs.com:1883"; const char * client_id = "12345"; MQTTClient_create(&client, host, client_id, MQTTCLIENT_PERSISTENCE_NONE, NULL); MQTTClient_setCallbacks (クライアント、NULL、NULL、msgarrvd、NULL); /* 証明書、ユーザー名、パスワードなどの接続パラメーターを設定します。 情報を実際の情報に置き換えます。 */ ssl_opts.trustStore = "root-ca.crt"; ssl_opts.privateKey = "client.key"; ssl_opts.keyStore = "client.crt"; conn_opts.ssl = &ssl_opts; conn_opts.username = "sdk_test01"; conn_opts.password = "hello123"; /* MQTT接続が確立されます。 */ if ((rc = MQTTClient_connect (クライアント, &conn_opts))) ! =MQTTCLIENT_SUCCESS) { printf("Failed to connect, return code % d\n", rc); 終了 (EXIT_FAILURE); } printf("connect success username % s, password % s\n", conn_opts.username, conn_opts.password); /* メッセージを購読します。 */ MQTTClient_subscribe (クライアント、"/user/aiot_mqtt_demo_downraw" 、1); /* メッセージを生成し、定期的にメッセージを送信します。 */ MQTTClient_message pubmsg = MQTTClient_message_initializer; const char * topic = "/user/aiot_mqtt_demo_upraw"; pubmsg.payload = "Hello Service!"; pubmsg.payloadlen = (int)strlen(pubmsg.payload); pubmsg.qos = 1; for(int i = 0; i < 100; i ++) { MQTTClient_publishMessage (クライアント、トピック、およびpubmsg、NULL); printf("message send > topic [% s], payload [% s]\n", topic, (char *)pubmsg.payload); 睡眠 (10); } /* 接続を閉じてMQTTクライアントを削除します。 */ MQTTClient_disconnect (クライアント、10000); MQTTClient_destroy(&クライアント); rcを返します。}上記のコードの情報を実際の情報に置き換え、Ecsキーを押して
:wqと入力し、enterキーを押してaiot_mqtt_demo.cファイルを保存します。パラメーター
説明
ホスト
デバイスを接続するMQTTゲートウェイのエンドポイント。 形式:
ssl://${Gateway endpoint }:${ ポート番号}手順3で取得したエンドポイントとポートを使用します。client_id
オプションです。 クライアントのID。 クライアントIDの長さは1 ~ 64文字である必要があります。 デバイスのMACアドレスまたはシリアル番号 (SN) をクライアントIDとして使用することを推奨します。
ssl_opts.trustStore
root-ca.crtデバイス側のルート証明書ファイルが格納されているパス。ssl_opts.privateKey
client.keyデバイス側ファイルが格納されているパス。ssl_opts.keyStore
client.crtデバイス側証明書ファイルが格納されているパス。conn_opts.username
MQTT接続を確立するために使用されるユーザー名。
ユーザー名は4 ~ 32文字で、英数字、ハイフン (-) 、アンダースコア (_) 、記号 (@) 、ピリオド (.) 、およびコロン (:) を使用できます。 ユーザー名は製品内で一意である必要があります。
conn_opts.password
MQTT接続を確立するために使用されるパスワード。
パスワードは1 ~ 32文字で、英数字、ハイフン (-) 、アンダースコア (_) 、記号 (@) 、ピリオド (.) 、およびコロン (:) を使用できます。
この例で生成および使用されるライブラリ、証明書ファイル、およびコードファイルを次の図に示します。
ステップ5: プログラムをコンパイルして実行する
次のコマンドを実行して、
aiot_mqtt_demo.cコードファイルを実行します。gcc -o aiot_mqtt_demo aiot_mqtt_demo.c -lpaho-mqtt3cs . /aiot_mqtt_デモコードファイルを実行すると、Function Compute関数によって返されるdeviceNameパラメーターの値Client_123がIoT PlatformデバイスのDeviceNameとして使用されます。 IoT Platformコンソールで管理するインスタンスの [インスタンスの詳細] ページに移動します。 左側のナビゲーションウィンドウで、[デバイス]> [デバイス] を選択すると、次の図に示すように、
[クライアント_123]という名前のデバイスが自動的に作成され、[オンライン] 状態になります。
オプションです。 IoT Platformコンソールで管理するインスタンスの [インスタンスの詳細] ページに移動します。 左側のナビゲーションウィンドウで、[メンテナンス]> [デバイスログ] を選択します。 [デバイスログ] ページで、デバイスによって送信されたデータを表示します。