全部產品
Search
文件中心

IoT Platform:MQTT雲網關X.509認證雙向認證

更新時間:Jun 30, 2024

裝置通過MQTT協議雲網關接入物聯網平台時,可開啟裝置與服務端雙向認證能力,進行裝置身份認證。本文使用Java代碼,以MQTT協議雲網關一方認證的X.509認證為例,介紹裝置如何通過X.509認證雙向認證接入物聯網平台。

前提條件

  • 已購買尊享型企業版執行個體。本樣本購買華東2(上海)地區的尊享型執行個體。具體操作,請參見購買企業版執行個體

  • 已準備雙向認證的認證。

    本樣本使用認證:根憑證root-ca.crt、服務端認證私密金鑰server.key、服務端認證server.crt、裝置端認證私密金鑰client.key和裝置端認證client.crt

背景資訊

物聯網平台提供MQTT雲網關功能,支援使用X.509認證認證和自訂認證等能力進行裝置認證並接入物聯網平台進行通訊,實現多種物聯網業務情境。

MQTT協議雲網關裝置認證和通訊說明,請參見MQTT協議雲網關概述

準備工作

本文使用Java語言開發裝置程式,準備Java開發環境如下:

建立雲網關產品和裝置

  1. 建立雲網關產品(MQTT):配置如下圖所示,服務端認證server.crt服務端認證私密金鑰server.key裝置端根憑證root-ca.crt

    image

  2. 在雲網關列表,複製網關URL儲存。

    image

  3. 建立雲網關裝置(MQTT):本樣本添加一個裝置,MQTT Usernamedevice01MQTT Passwordhello456

開發裝置程式

  1. 下載aiot-java-dual-auth-demo程式碼封裝,並解壓。

  2. 開啟IntelliJ IDEA,匯入程式碼封裝中的樣本工程aiot-java-demo 3

    • 在工程的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下MQTT雲網關雙向認證裝置的程式檔案為:

      • SslUtil.java:讀取裝置認證。

      • Mqtt5TlsApp.java:開發裝置接入。

  3. 在工程的pom.xml檔案中,單擊Load Maven Changes表徵圖,完成依賴包下載。

  4. 在工程的/src/main路徑下,建立檔案夾resources

  5. 在工程的/src/main/resources路徑下匯入認證檔案:根憑證root-ca.crt、裝置端認證私密金鑰client.key和裝置端認證client.crt

    image

  6. 開啟工程下的/src/main/java/com/aliyun/iot/SslUtil.java檔案,修改產生認證的密鑰。

    重要

    clientKs.setKeyEntry()中密鑰123456是產生認證時設定的,請根據實際情境修改。

    ......
          //注意密鑰,按自己的密鑰填寫
          clientKs.setKeyEntry("private-key", key.getPrivate(), "123456".toCharArray(), new java.security.cert.Certificate[]{clientCertificate});
    ......
  7. 開啟工程下的/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";
            //client認證儲存路徑
            String clientCertPath= "src/main/resources/client.crt";
            //client私密金鑰儲存路徑
            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,需自訂,長度不可超過64個字元。建議使用裝置的MAC地址或SN碼,方便您識別區分不同的用戶端。

    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中的網域名稱和自訂連接埠號碼。

  8. 運行程式檔案Mqtt5TlsApp.java,裝置與服務端進行雙向認證。

    說明

    本樣本Mqtt5TlsApp.java代碼中,添加了結束程式的代碼(Thread.sleep(20000);),即程式啟動成功,運行20秒後會主動中斷連線。實際情境中,您可根據業務需求自行設定裝置上線、離線的邏輯。

    執行結果如圖所示,認證通過後,裝置接入物聯網平台。

    image