设备通过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开发环境如下:
操作系统:Windows 10 64位
JDK版本:JDK8
集成开发环境:IntelliJ IDEA社区版
创建云网关产品和设备
创建云网关产品(MQTT):配置如下图所示,服务端证书为
server.crt
、服务端证书私钥为server.key
、设备端根证书为root-ca.crt
。在云网关列表,复制网关URL保存。
创建云网关设备(MQTT):本示例添加一个设备,MQTT Username为
device01
,MQTT Password为hello456
。
开发设备程序
打开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
:开发设备接入。
在工程的
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
是生成证书时设置的,请根据实际场景修改。...... //注意密钥,按自己的密钥填写 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"; //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中的域名和自定义端口号。运行程序文件
Mqtt5TlsApp.java
,设备与服务端进行双向认证。说明本示例
Mqtt5TlsApp.java
代码中,添加了结束程序的代码(Thread.sleep(20000);
),即程序启动成功,运行20秒后会主动断开连接。实际场景中,您可根据业务需求自行设置设备上线、离线的逻辑。执行结果如图所示,认证通过后,设备接入物联网平台。