Message Queuing Telemetry Transport (MQTT) ゲートウェイを使用してデバイスを IoT Platform に接続する際に、デバイスと IoT Platform 間で双方向検証を有効にすることで、デバイスの ID を検証できます。このトピックでは、X.509 証明書ベースの双方向検証を使用してデバイスを IoT Platform に接続する方法について説明します。この例では、Authentication Type パラメーターを One-party Verification に、Enable X.509 certificate-based Device Verification パラメーターを Yes に設定した MQTT ゲートウェイを作成し、Java サンプルコードを提供します。
前提条件
Exclusive Enterprise Edition インスタンスが購入済みであること。この例では、中国 (上海) リージョンで Exclusive 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 Development Kit (JDK):JDK 8
統合開発環境 (IDE): IntelliJ IDEA Community Edition
ゲートウェイの作成とデバイスの追加
MQTT ゲートウェイを作成 します。[ゲートウェイの追加] ダイアログボックスで、[サーバー証明書] パラメーターを
server.crtファイルの内容に、[サーバー証明書の秘密鍵] パラメーターをserver.keyファイルの内容に、[デバイスルート証明書] パラメーターをroot-ca.crtファイルの内容に設定します。次に、他のパラメーターを次のように設定します。[プロトコル] を [MQTT] に設定
[カスタムポート] を
1883に設定[認証タイプ] を [単方向検証] に設定
[データ解析の有効化] を [いいえ] に設定
[デバイスの X.509 証明書認証を有効にする] を [はい] に設定
[OCSP の有効化] を [無効] に設定
[ゲートウェイ] ページで、ゲートウェイの [ゲートウェイ URL] 列にある URL をコピーします。[ゲートウェイ URL] の形式例は
iot-{ゲートウェイ識別子}.igw.iothub.aliyuncs.comで、ポート番号は1883です。MQTT ゲートウェイ製品にデバイスを追加します。この例では、[MQTT Username] に
device01、[MQTT Password] にhello456を設定したデバイスを追加します。
デバイスプログラムの開発
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 Username] の値。
password
hello456追加したデバイスの [MQTT Password] の値。
clientId
test01_client1(オプション) クライアントの ID。クライアント ID は 1~64 文字である必要があります。デバイスの MAC アドレスまたはシリアル番号 (SN) をクライアント ID として使用することを推奨します。
caCertPath
src/main/resources/root-ca.crtデバイスルート証明書ファイル
root-ca.crtが格納されているプロジェクトパス。clientCertPath
src/main/resources/client.crtデバイス証明書ファイル
client.crtが格納されているプロジェクトパス。clientKeyPath
src/main/resources/client.keyデバイス側の秘密鍵ファイル
client.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 に接続されます。
broker: ssl://iot-xxx.igw.iothub.aliyuncs.com:1883 Connected broker available ability, retain is available: true broker available ability, shared subscription is available: true publish: content finish Disconnected