MQTT(Message Queuing Telemetry Transport)ゲートウェイを使用してデバイスを IoT Platform に接続する場合、デバイスと IoT Platform 間の双方向認証を有効にして、デバイスの ID を検証できます。このトピックでは、X.509 証明書ベースの双方向認証を使用してデバイスを IoT Platform に接続する方法について説明します。この例では、認証タイプパラメータが一方検証に設定され、X.509 証明書ベースのデバイス検証を有効にするパラメータがはいに設定されている MQTT ゲートウェイが作成され、サンプル Java コードが提供されます。
前提条件
排他的 Enterprise Edition インスタンスが購入済みであること。この例では、中国 (上海) リージョンで購入された排他的 Enterprise Edition インスタンスが使用されます。詳細については、「Enterprise Edition インスタンスを購入する」をご参照ください。
双方向認証の実行に必要な証明書が準備されていること。
この例では、次の証明書ファイルが使用されます。
root-ca.crtルート証明書ファイル、server.keyサーバー側の秘密鍵ファイル、server.crtサーバー側の証明書ファイル、client.keyデバイス側の秘密鍵ファイル、およびclient.crtデバイス証明書ファイル。
背景情報
IoT Platform は MQTT ゲートウェイを提供し、X.509 証明書とカスタム証明書を使用して、デバイスを検証し IoT Platform に接続して通信できるようにします。これにより、IoT Platform はさまざまな IoT ビジネスシナリオの要件を満たすことができます。
MQTT ゲートウェイとデバイス間の検証と通信の詳細については、「MQTT ゲートウェイ」をご参照ください。
準備
この例では、Java を使用してプログラムを開発します。次の要件を満たす Java 開発環境を準備します。
オペレーティングシステム: Windows 10 ( 64 ビット)
Java 開発キット (JDK): JDK 8
統合開発環境 (IDE): IntelliJ IDEA Community Edition
ゲートウェイを作成し、デバイスを追加する
MQTT ゲートウェイを作成する: [ゲートウェイの追加] ダイアログボックスで、[サーバー証明書] パラメータを
server.crtファイルの内容に設定し、[サーバー証明書の秘密鍵] パラメータをserver.keyファイルの内容に設定し、[デバイスルート証明書] パラメータをroot-ca.crtファイルの内容に設定します。次に、次の図に示すように、他のパラメータを設定します。
[ゲートウェイ] ページで、ゲートウェイの [ゲートウェイ URL] 列の URL をコピーします。

MQTT ゲートウェイ プロダクトにデバイスを追加する。この例では、MQTT ユーザー名 パラメーターが
device01に設定され、MQTT パスワード パラメーターがhello456に設定されているデバイスが追加されます。
デバイスプログラムを開発する
aiot-java-dual-auth-demo コードパッケージをダウンロードする。ダウンロードが完了したら、コードパッケージを解凍します。
IntelliJ IDEA を開き、コードパッケージから
aiot-java-demoサンプルプロジェクトをインポートします。pom.xmlファイルに Maven 依存関係を追加します。この例では、次の依存関係が使用されます。<dependency> <groupId>org.eclipse.paho</groupId> <artifactId>org.eclipse.paho.mqttv5.client</artifactId> <version>1.2.5</version> </dependency> <dependency> <groupId>org.eclipse.paho</groupId> <artifactId>org.eclipse.paho.client.mqttv3</artifactId> <version>1.2.0</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcpkix-jdk15on</artifactId> <version>1.47</version> </dependency>プロジェクトの
/src/main/java/com/aliyun/iotディレクトリには、双方向認証の実行に必要な次のプログラムファイルが含まれています。SslUtil.java: デバイス証明書を読み取ります。Mqtt5TlsApp.java: デバイスを IoT Platform に接続します。
プロジェクトの
pom.xmlファイルで、[ Load Maven Changes ] をクリックして依存関係パッケージをダウンロードします。プロジェクトの
/src/mainディレクトリに、resourcesという名前のフォルダを作成します。プロジェクトの
/src/main/resourcesディレクトリに、次の証明書ファイルをインポートします。ルート証明書を含むroot-ca.crt、デバイス側の秘密鍵を含むclient.key、およびデバイス証明書を含むclient.crt。
プロジェクトの
/src/main/java/com/aliyun/iot/SslUtil.javaファイルで、証明書の生成に使用されるキーを変更します。重要clientKs.setKeyEntry()関数に指定された値123456は、証明書の生成に使用されるキーを示します。ビジネスシナリオに基づいて値を変更してください。...... // 123456 を実際のキー値に置き換えます。 clientKs.setKeyEntry("private-key", key.getPrivate(), "123456".toCharArray(), new java.security.cert.Certificate[]{clientCertificate}); ......プロジェクトの
/src/main/java/com/aliyun/iot/Mqtt5TlsApp.javaファイルを開き、デバイス接続パラメータを変更します。...... // MQTT 接続パラメータ String userName = "device01"; String password = "hello456"; String clientId = "test01_client1"; // ルートディレクトリが格納されているパス。 String caCertPath = "src/main/resources/root-ca.crt"; // デバイス証明書が格納されているパス。 String clientCertPath= "src/main/resources/client.crt"; // デバイス側の秘密鍵が格納されているパス。 String clientKeyPath="src/main/resources/client.key"; // MQTT ゲートウェイの URL。 String broker = "ssl://iot-*******.igw.iothub.aliyuncs.com:1883"; ......パラメータ
例
説明
userName
device01追加したデバイスの MQTT ユーザー名 パラメーターの値です。
password
hello456追加されたデバイスの MQTT パスワード パラメーターの値です。
clientId
test01_client1(オプション) クライアントの ID。クライアント ID は 1 ~ 64 文字である必要があります。デバイスの MAC アドレスまたはシリアル番号 (SN) をクライアント ID として使用することをお勧めします。
caCertPath
src/main/resources/root-ca.crtroot-ca.crtデバイスルート証明書ファイルが格納されているプロジェクトパス。clientCertPath
src/main/resources/client.crtclient.crtデバイス証明書ファイルが格納されているプロジェクトパス。clientKeyPath
src/main/resources/client.keyclient.keyデバイス側の秘密鍵ファイルが格納されているプロジェクトパス。broker
ssl://iot-*******.igw.iothub.aliyuncs.com:1883デバイスを接続する MQTT ゲートウェイのエンドポイント。フォーマット:
ssl://${ゲートウェイエンドポイント}:${ポート番号}。${ゲートウェイエンドポイント}と${ポート番号}を、保存した [ゲートウェイ URL] のカスタムポート番号のエンドポイントに置き換えます。Mqtt5TlsApp.javaプログラムファイルを実行して、デバイスと IoT Platform 間の双方向認証を実行します。説明この例では、
Thread.sleep(20000);がMqtt5TlsApp.javaファイルに追加されています。Thread.sleep(20000); コードは、プログラムの実行後 20 秒で Mqtt5TlsApp.java プログラムを終了し、デバイスと IoT Platform との接続を切断します。実際のシナリオでは、デバイスを接続または切断するためのカスタムコードを記述できます。次の図は結果を示しています。デバイスが検証に合格すると、デバイスは IoT Platform に接続されます。
