設備通過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秒后會主動斷開連接。實際場景中,您可根據業務需求自行設置設備上線、離線的邏輯。執行結果如圖所示,認證通過后,設備接入物聯網平臺。