本文介紹了設備如何通過更安全的身份認證方式(ID2)連接到您自建的物聯網系統(設備管理平臺)。適用于集成了ID2安全芯片的設備。
1. 術語
Soft-KM(Key Management)密鑰管理,由阿里提供的軟件安全沙箱,基于軟件加固和虛擬化技術提供對密鑰(IoT ID2)的安全保護。
OSA(Operation System Abstractor Layer)操作系統抽象層,定義內存申請和釋放、日志打印、系統時間、網絡通信等接口,非遵循POSIX標準的OS,需重新適配這些接口。
HAL(Hardware Abstractor Layer)硬件抽象層,根據設備硬件特性,完成對加解密算法、設備唯一ID、密鑰管理和數據安全存儲的接口適配。
TLS(Transport Layer Security)安全傳輸層協議, 用于兩個通信實體之間,保護通信數據的私密性和完整性。
IoT(Internet of things)物聯網,基于互聯網實現萬物互聯。
LP(Link Platform)阿里云物聯網平臺,提供物聯網的設備管理。
SE(Secure Element)安全元件,也稱安全芯片,單獨的防篡改硬件,專門用于存儲和數據加密。
AT指令,終端設備和外設模塊之間的連接和通信的指令。
ID2安全芯片,或ID2-SE芯片,在安全芯片生產時燒錄ID2密鑰,基于安全芯片的物理防護特性保護ID2密鑰的存儲和運行安全,通過SE AT指令提供ID2密鑰的基礎運算。
2. 產品架構
ID2控制中心:
ID2的Web控制臺,提供對ID2產線灌裝、ID2產品和配額申請、以及ID2使用統計的管理。
ID2服務中心:
ID2在云端的應用,提供ID2的各種安全能力,包括ID2密鑰安全分發、設備認證、基于ID2的安全連接協議等;同時,提供各種能力的云端接口,支持業務平臺的二次開發,支持不同的安全業務需求和場景。
ID2 Client SDK:
ID2在設備端的功能組件和軟件開發框架,可支持不同操作系統和不同硬件,為IoT設備提供基于ID2的端到端的設備認證、數據加解密等各種安全能力。
3. ID2接入流程
3.1 概述:
客戶自建服務的方式,ID2通過云端和設備端接口的方式,提供基于ID2的設備認證和會話密鑰加密下發,應用數據通過下發的會話密鑰進行加密傳輸。
ID2對接步驟如下:
3.2 購買ID2:
購買ID2安全元器件:
點擊購買鏈接 - ID2安全元器件。
選擇硬件類型、型號和數量:
3.3 創建產品:
登錄產品控制臺,在左側導航欄,選擇常規>集成與部署 > IoT設備身份認證,單擊獨立使用(三方物聯網平臺)卡片的開始接入按鈕。
在配置產品頁面創建新產品&分配ID2授權,然后單擊下一步按鈕。
選擇產品:請選擇創建新產品,并輸入產品名稱。
ID2有效期:請選擇1年、3年、或5年。
分配ID2授權數量:填寫實際的設備數量,不超過賬號下可分配ID2的數量。
3.4 選擇設備認證算法:
IoT設備身份認證支持國際算法(AES-128、AES-192、AES-256)和國密算法(SM1-128、SM2-256、SM4-128),能滿足企業不同安全等級的需求。
說明
國密算法SM1需要配合ID2安全芯片使用,SM2用于業務數據完整性校驗和加密。
創建的ID2產品默認選擇的設備認證算法是AES-128;如需選擇其他設備認證算法,請按如下步驟操作:
在產品控制臺,選擇常規>集成與部署 > IoT設備身份認證,單擊獨立使用(三方物聯網平臺)卡片的開始接入按鈕。
在配置產品頁面獲取配置信息,然后單擊下一步按鈕。
選擇產品:請選擇現有產品,在下拉框中勾選產品名稱。
在獲取配置信息頁面,單擊設備認證算法后的更換按鈕,查看支持的密鑰類型(如SM4-128),并確認。
在獲取配置信息頁面,記錄下ProductKey、ProductSecret。
ProductKey:設備所屬產品的ProductKey。
ProductSecret:由IoT設備身份認證頒發的產品密鑰,與 ProductKey 成對出現。
3.5 集成云端SDK
3.5.1 阿里云賬號的AccessKey
AccessKey是調用阿里云API的身份憑證,請參見獲取AccessKey。
需要注意的是AccessKey的歸屬賬號必須與創建產品時的賬號保持一致。
3.5.2 下載云端SDK
在集成云端SDK頁面,單擊點擊下載右側的圖標,獲取云端SDK的下載地址。然后在設備端執行wget命令獲取設備端SDK。
wget https://id2-schip-online.oss-cn-shanghai.aliyuncs.com/static_resources/id2_server_sdk/ID2_Server_SDK.tar
在云端環境執行命令tar -xvf ID2_Server_SDK.tar 完成解壓,執行命令cd <解壓SDK后的目錄>。設備端SDK的目錄說明見表格內容:
目錄/文件 | 說明 |
demos | ID2云端的示例代碼 |
lib | ID2云端的Jar包 |
3.5.3 集成云端SDK
添加Maven項目依賴,引入阿里云Java SDK公共包。
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.6</version>
</dependency>
導入云端SDK中的lib/aliyun-java-sdk-id2-1.1.4.jar到項目工程中,初始化云端SDK。
public static String ACCESS_KEY = null;
public static String ACCESS_SECRET = null;
public static String REGION_ID = "cn-shanghai";
public static String END_POINT = "id2." + REGION_ID + ".aliyuncs.com";
// Load ACCESS_KEY and ACCESS_SECRET From Config File
loadConfigProperties("xxx.conf");
IClientProfile profile = DefaultProfile.getProfile(REGION_ID, ACCESS_KEY, ACCESS_SECRET);
DefaultProfile.addEndpoint(REGION_ID, PRODUCT_CODE, END_POINT);
client = new DefaultAcsClient(profile);
發起調用,ID2云端SDK為每個API封裝了一個類,命名為${API名稱}+"Request",如VerifyRequest,用于API的調用請求,ID2云端API列表請參考服務端API。
ID2空發
OtpGetId2Request request = new OtpGetId2Request();
request.setDeviceAuthCode(authCode);
request.setApiVersion(1.1.2);
OtpGetId2Response response = client.getAcsResponse(request);
獲取ID2認證挑戰字
GetServerRandomRequest request = new GetServerRandomRequest();
request.setId2(id2Id);
request.setApiVersion(1.1.2);
GetServerRandomResponse response = client.getAcsResponse(request);
System.out.println("GetServerRadom requestId:" + response.getRequestId());
ID2設備認證和業務密鑰加密
VerifyAndEncryptRequest request = new VerifyAndEncryptRequest();
request.setApiVersion(1.1.2);
request.setProductKey(productKey);
request.setId2(id2Id);
request.setAuthCode(authCode);
request.setData(keyInfo);
VerifyAndEncryptResponse response = client.getAcsResponse(request);
System.out.println("VerifyAndEncrypt requestId:" + response.getRequestId());
應用集成ID2云端SDK的示例代碼,請參考demos/ID2SPDemo
3.6 集成設備端SDK:
3.6.1 ID2設備端SDK框架:
IoT Application:
設備端的應用程序,負責業務數據處理,包括設備認證、設備建連和數據收發等。
IoT Linkkit:
阿里云物聯網平臺的接入SDK,提供IoT設備安全連接到阿里云IoT平臺,提供數據連云的安全通道,以及業務數據的管理。
ID2 Client SDK:
ID2:IoT設備認證的對外接口,上層應用/協議基于此接口進行開發。
KM:密鑰管理模塊,支持不同形式的載體:
Soft-KM:軟件沙箱,基于軟件加固和虛擬化技術提供對ID2密鑰的安全保護。
SE:安全芯片,基于物理防護機制,提供對ID2密鑰的安全保護,通過AT指令對設備提供ID2的運算。
Crypto:提供統一的加解密算法接口。
OSA:操作系統適配接口,廠商需根據使用的OS,重新進行接口適配。
HAL:硬件適配接口,提供算法庫和Soft-KM的適配接口,廠商需根據選擇的硬件平臺,重新進行接口適配。
3.6.2 下載設備端SDK:
ID2 SDK下載:
ID2 Release Package目錄:
目錄/文件 | 說明 |
modules | 核心模塊代碼 |
include | 頭文件 |
app | 測試代碼,可用于集成調試 |
sample | ID2的示例代碼 |
doc | 文檔 |
make.settings | ID2 SDK統一配置文件:
|
make.rules | 編譯系統配置文件,可配置編譯工具鏈和編譯參數 |
makefile | 編譯腳本 |
3.6.3 集成設備端SDK:
設備硬件及系統層集成, 詳情請參考ID2安全Agent適配接口:
OSA接口適配:實現src/osa/ls_osa.c中的接口。
IROT HAL接口適配:
進入modules/irot/se目錄。
在chipset目錄, 創建新增安全芯片的目錄(如fm1280),復制template中全部文件到新增的目錄,并修改makefile指定到新建的目錄。
打開chipset/fm1280/se_driver/se_driver.c, 適配SE芯片驅動接口:
se_open_session - SE初始化
se_transmit - 發送APDU指令,并獲取response。
se_close_session - SE關閉。
設備應用層集成,詳情請參考設備端API
設備應用首先調用ID2的初始化函數,完成設備端SDK的初始化。
{
int ret;
ret = id2_client_init();
if (ret != IROT_SUCCESS) {
ls_osa_print("id2 client init fail, %d\n", ret);
return -1;
}
}
獲取設備端的ID2 ID。
{
int ret;
ret = id2_client_init();
if (ret != IROT_SUCCESS) {
ls_osa_print("id2 client init fail, %d\n", ret);
return -1;
}
}
ID2認證挑戰字的網絡請求和響應。
{
int ret;
ret = id2_client_init();
if (ret != IROT_SUCCESS) {
ls_osa_print("id2 client init fail, %d\n", ret);
return -1;
}
}
獲取設備端的ID2認證碼。
{
int ret;
ret = id2_client_init();
if (ret != IROT_SUCCESS) {
ls_osa_print("id2 client init fail, %d\n", ret);
return -1;
}
}
設備端認證和數據加密的網絡請求和響應。
cipherData:ID2云端下發的加密數據
{
int ret;
ret = id2_client_init();
if (ret != IROT_SUCCESS) {
ls_osa_print("id2 client init fail, %d\n", ret);
return -1;
}
}
解密ID2云端加密下發的數據。
{
int ret;
ret = id2_client_init();
if (ret != IROT_SUCCESS) {
ls_osa_print("id2 client init fail, %d\n", ret);
return -1;
}
}
設備端SDK的編譯:
在ID2 SDK的根目錄,執行命令vi ./make.settings打開文件:
修改CONFIG_LS_ID2_ROT_TYPE的值為SE
修改CONFIG_LS_ID2_KEY_TYPE的值,同ID2產品選擇的認證算法保持相同
執行命令“make clean & make plat=xxx”進行編譯
Linux x86_64默認使用系統中的GCC作為編譯工具,且默認指定“plat=x86_64”參數
如要編譯其他架構,如armhf,在make.rules中配置編譯工具,運行編譯命令“make clean & make plat=armhf”
3.7 業務數據加密
運行設備端自有的應用和自建的SPDemo Server,進行ID2認證和加密,以及業務數據加密的調試。
查看設備狀態:
登錄產品控制臺,在左側導航欄,選擇資產>設備,查看設備狀態為正常,安全狀態為安全。