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