MQTT云网关X.509证书双向认证

设备通过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