資安

阿里雲物聯網平臺一型一密獲取:DeviceSecret 示例

作者:俏巴

概述

一型一密安全認證方式下,同一產品下所有設備可以燒錄相同固件(即燒錄ProductKey和ProductSecret)。設備發送激活請求時,物聯網平臺進行身份確認,認證通過,下發該設備對應的DeviceSecret。本文主要演示如何使用JAVA SDK動態獲取DeviceSecret。

操作步驟

1、在阿里雲物聯網平臺控制檯,創建產品。
_

2、在已創建產品的產品詳情頁面,開啟動態註冊開關。
_

3、在該產品下,添加設備。添加成功的設備狀態為未激活。因設備激活時會校驗DeviceName,建議您採用可以直接從設備中讀取到的ID,如設備的MAC地址、IMEI或SN號等,作為DeviceName使用。
_
4、程序調用

4.1 pom.xml

    <span class="xml"><span class="hljs-tag"><<span class="hljs-name">repository</span>></span>
        <span class="hljs-tag"><<span class="hljs-name">id</span>></span>alimaven<span class="hljs-tag"></<span class="hljs-name">id</span>></span>
        <span class="hljs-tag"><<span class="hljs-name">name</span>></span>aliyun maven<span class="hljs-tag"></<span class="hljs-name">name</span>></span>
        <span class="hljs-tag"><<span class="hljs-name">url</span>></span>http://maven.aliyun.com/nexus/content/groups/public/<span class="hljs-tag"></<span class="hljs-name">url</span>></span>
    <span class="hljs-tag"></<span class="hljs-name">repository</span>></span></span>
<<span class="hljs-regexp">/repositories>

<dependencies>
    <dependency>
        <groupId>com.aliyun.alink.linksdk</g</span>roupId>
        <span class="xml"><span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>iot-linkkit-java<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span></span>
        <version><span class="hljs-number">1.2</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span><<span class="hljs-regexp">/version>
        <scope>compile</</span>scope>
    <span class="xml"><span class="hljs-tag"></<span class="hljs-name">dependency</span>></span></span>
    <dependency>
        <span class="xml"><span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>com.google.code.gson<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span></span>
        <artifactId>gson<<span class="hljs-regexp">/artifactId>
        <version>2.8.1</</span>version>
        <span class="xml"><span class="hljs-tag"><<span class="hljs-name">scope</span>></span>compile<span class="hljs-tag"></<span class="hljs-name">scope</span>></span></span>
    <<span class="hljs-regexp">/dependency>
    <dependency>
        <groupId>com.alibaba</g</span>roupId>
        <span class="xml"><span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>fastjson<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span></span>
        <version><span class="hljs-number">1.2</span><span class="hljs-number">.40</span><<span class="hljs-regexp">/version>
        <scope>compile</</span>scope>
    <span class="xml"><span class="hljs-tag"></<span class="hljs-name">dependency</span>></span></span>
<<span class="hljs-regexp">/dependencies>

<build>
    <finalName>iot-java-sdk</</span>finalName>
    <span class="xml"><span class="hljs-tag"><<span class="hljs-name">plugins</span>></span>
        <span class="hljs-tag"><<span class="hljs-name">plugin</span>></span>
            <span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.apache.maven.plugins<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span>
            <span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>maven-compiler-plugin<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span>
            <span class="hljs-tag"><<span class="hljs-name">configuration</span>></span>
                <span class="hljs-tag"><<span class="hljs-name">source</span>></span>1.8<span class="hljs-tag"></<span class="hljs-name">source</span>></span>
                <span class="hljs-tag"><<span class="hljs-name">target</span>></span>1.8<span class="hljs-tag"></<span class="hljs-name">target</span>></span>
                <span class="hljs-tag"><<span class="hljs-name">encoding</span>></span>UTF-8<span class="hljs-tag"></<span class="hljs-name">encoding</span>></span>
            <span class="hljs-tag"></<span class="hljs-name">configuration</span>></span>
        <span class="hljs-tag"></<span class="hljs-name">plugin</span>></span>
    <span class="hljs-tag"></<span class="hljs-name">plugins</span>></span></span>
<<span class="hljs-regexp">/build></span></code></pre>

4.2 Code Sample


import com.aliyun.alink.apiclient.CommonRequest;
import com.aliyun.alink.apiclient.CommonResponse;
import com.aliyun.alink.apiclient.IoTCallback;
import com.aliyun.alink.apiclient.utils.StringUtils;
import com.aliyun.alink.dm.api.DeviceInfo;
import com.aliyun.alink.dm.api.IoTApiClientConfig;
import com.aliyun.alink.dm.model.ResponseModel;
import com.aliyun.alink.linkkit.api.IoTMqttClientConfig;
import com.aliyun.alink.linkkit.api.LinkKit;
import com.aliyun.alink.linkkit.api.LinkKitInitParams;
import com.aliyun.alink.linksdk.tools.ALog;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.util.Map;

// 動態獲取設備Secret
public class GetDeviceSecret {

private <span class="hljs-keyword">static</span> final <span class="hljs-built_in">String</span> TAG = <span class="hljs-string">"GetDeviceSecret"</span>;

public <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> main(<span class="hljs-built_in">String</span>[] args) {

    DeviceInfo deviceInfo = <span class="hljs-keyword">new</span> DeviceInfo();
    deviceInfo.productKey = <span class="hljs-string">"********"</span>;
    deviceInfo.deviceName = <span class="hljs-string">"********"</span>;
    deviceInfo.productSecret = <span class="hljs-string">"********"</span>;

    LinkKitInitParams params = <span class="hljs-keyword">new</span> LinkKitInitParams();
    IoTMqttClientConfig config = <span class="hljs-keyword">new</span> IoTMqttClientConfig();
    config.productKey = deviceInfo.productKey;
    config.deviceName = deviceInfo.deviceName;
    params.mqttClientConfig = config;
    params.connectConfig = <span class="hljs-keyword">new</span> IoTApiClientConfig();
    params.deviceInfo = deviceInfo;

    final CommonRequest request = <span class="hljs-keyword">new</span> CommonRequest();
    request.setPath(<span class="hljs-string">"/auth/register/device"</span>);
    LinkKit.getInstance().deviceRegister(params, request, <span class="hljs-keyword">new</span> IoTCallback() {
        public <span class="hljs-keyword">void</span> onFailure(CommonRequest commonRequest, Exception e) {
            ALog.e(TAG, <span class="hljs-string">"動態註冊失敗 "</span> + e);
        }

        public <span class="hljs-keyword">void</span> onResponse(CommonRequest commonRequest, CommonResponse commonResponse) {
            <span class="hljs-keyword">if</span> (commonResponse == <span class="hljs-literal">null</span> || StringUtils.isEmptyString(commonResponse.getData())) {
                ALog.e(TAG, <span class="hljs-string">"動態註冊失敗 response=null"</span>);
                <span class="hljs-keyword">return</span>;
            }
            <span class="hljs-keyword">try</span> {
                ResponseModel<<span class="hljs-built_in">Map</span><<span class="hljs-built_in">String</span>, <span class="hljs-built_in">String</span>>> response = <span class="hljs-keyword">new</span> Gson().fromJson(commonResponse.getData(), <span class="hljs-keyword">new</span> TypeToken<ResponseModel<<span class="hljs-built_in">Map</span><<span class="hljs-built_in">String</span>, <span class="hljs-built_in">String</span>>>>() {
                }.getType());
                <span class="hljs-keyword">if</span> (response != <span class="hljs-literal">null</span> && <span class="hljs-string">"200"</span>.equals(response.code)) {
                    ALog.d(TAG, <span class="hljs-string">"register success "</span> + (commonResponse == <span class="hljs-literal">null</span> ? <span class="hljs-string">""</span> : commonResponse.getData()));
                    <span class="hljs-comment">/**  獲取 deviceSecret, 存儲到本地,然後執行初始化建聯
                     * 這個流程只能走一次,獲取到 secret 之後,下次啟動需要讀取本地存儲的三元組,
                     * 直接執行初始化建聯,不可以再走動態初始化
                     */</span>
                    <span class="hljs-built_in">String</span> deviceSecret = response.data.get(<span class="hljs-string">"deviceSecret"</span>);
                    System.out.println(<span class="hljs-string">"deviceSecret: "</span> + deviceSecret);
                }
            } <span class="hljs-keyword">catch</span> (Exception e) {
                ALog.d(TAG, e.getMessage());
            }
            ALog.d(TAG, <span class="hljs-string">"register fail "</span> + commonResponse.getData());
        }
    });
}

}


4.3 運行結果


_


5、注意事項



5.1 未激活的設備,使用ProductKey、DeviceName,可以反覆註冊獲取DeviceSecret,每次獲取的DeviceSecret都不同。已激活的設備,DeviceSecret唯一。若需要重新激活該設備,請首先在物聯網平臺上刪除設備,重新註冊,使用新的ProductKey、DeviceName獲取DeviceSecret。


5.2 採用一型一密方式認證,設備燒錄相同固件,存在產品證書洩露風險。您可以在產品詳情頁面,手動關閉動態註冊開關,拒絕新設備的認證請求。


5.3 若設備發出激活請求時,系統校驗發現該開關未開啟,將拒絕新設備的動態激活請求。已激活設備不受影響。



參考鏈接


一型一密


雲端Java SDK使用說明

Leave a Reply

Your email address will not be published. Required fields are marked *