使用ID²-KM将设备接入自建的物联网系统
本文介绍了设备如何通过更安全的身份认证方式(ID²)连接到您自建的物联网系统(设备管理平台)。
1. 术语
Soft-KM(Key Management)密钥管理,由阿里提供的软件安全沙箱,基于软件加固和虚拟化技术提供对密钥(IoT ID²)的安全保护。
OSA(Operation System Abstractor Layer)操作系统抽象层,定义内存申请和释放、日志打印、系统时间、网络通信等接口,非遵循POSIX标准的OS,需重新适配这些接口。
HAL(Hardware Abstractor Layer)硬件抽象层,根据设备硬件特性,完成对加解密算法、设备唯一ID、密钥管理和数据安全存储的接口适配。
ID² OTP(One-Time Provisioning)一次性烧录,也称ID²空发,指设备在第一次联网时,通过网络请求,下发ID²数据烧录到设备中。
TLS(Transport Layer Security)安全传输层协议, 用于两个通信实体之间,保护通信数据的私密性和完整性。
IoT(Internet of things)物联网,基于互联网实现万物互联。
2. ID²产品架构

ID²控制中心:
ID²的Web控制台,提供对ID²产线灌装、ID²产品和配额申请、以及ID²使用统计的管理。
ID²服务中心:
ID²在云端的应用,提供ID²的各种安全能力,包括ID²密钥安全分发、设备认证、基于ID²的安全连接协议等;同时,提供各种能力的云端接口,支持业务平台的二次开发,支持不同的安全业务需求和场景。
ID² Client SDK(ID²设备端SDK):
ID²在设备端的功能组件和软件开发框架,可支持不同操作系统和不同硬件,为IoT设备提供基于ID²的端到端的设备认证、数据加解密等各种安全能力。
3. ID²接入流程
3.1 概述

客户自建服务的方式,ID²通过云端和设备端接口的方式,提供基于ID²的设备认证和会话密钥加密下发,应用数据通过下发的会话密钥进行加密传输。
ID²对接步骤如下:

3.2 创建产品:
登录IoT安全中心:
选择资产管理->直连设备->创建产品:

在弹出页面中,选择"只需要使用物联网身份-设备认证":

填写自定义的产品名称,选择合适的密钥类型:
密钥类型下拉列表中,选择需要的密钥类型:
AES-128
AES-192
AES-256
3DES-112
3DES-168
SM4-128

创建成功后,可以在产品详情页面看到产品的ProductKey等信息:

3.3 购买ID²
购买ID²认证授权:
点击购买链接 - 购买ID²认证授权。
选择绑定的产品、购买数量和有效期:

3.4 设备端对接
3.4.1 ID²设备端SDK框架

IoT Application:
设备端的应用程序,负责业务数据处理,包括设备认证、设备建连和数据收发等。
IoT Linkkit:
阿里云物联网平台的接入SDK,提供IoT设备安全连接到阿里云IoT平台,提供数据连云的安全通道,以及业务数据的管理。
ID² Client SDK:
ID²:IoT设备认证的对外接口,上层应用/协议基于此接口进行开发。
KM:密钥管理模块,支持不同形式的载体:
Soft-KM:软件沙箱,基于软件加固和虚拟化技术提供对ID²密钥的安全保护。
SE:安全芯片,基于物理防护机制,提供对ID²密钥的安全保护,通过AT指令对设备提供ID²的运算。
Crypto:提供统一的加解密算法接口。
OSA:操作系统适配接口,厂商需根据使用的OS,重新进行接口适配。
HAL:硬件适配接口,提供算法库和Soft-KM的适配接口,厂商需根据选择的硬件平台,重新进行接口适配。
3.4.2 ID²设备端SDK获取
ID² 设备端 SDK下载:
请到ID²设备端SDK参考页面下载ID²设备端的SDK。
本文以 ID²设备端SDK v3.1及以上版本为例。
ID² Release Package目录:
目录/文件 | 说明 |
app | 测试用例,包括HAL和ID² |
include | 头文件 |
libs | ID²模块的静态库 |
makefile | 编译脚本 |
make.rules | 编译系统配置文件,可配置编译工具链和编译参数 |
sample | ID²的示例代码 |
src | 需适配的OSA和HAL接口和参考实现 |
3.4.3 ID²设备端SDK对接
设备端适配:
根据选择的OS和硬件平台,完成ID²设备端SDK的移植。

基于ID² Release Package进行移植,OSA和HAL需要厂商根据接口说明进行重新适配。
第一步:OSA接口适配:
实现src/osa/ls_osa.c中的接口:
已提供Linux系统的参考实现,可只实现其中的基础接口和网络接口。
第二步:HAL接口适配:
实现src/hal/km/demo/ls_hal_km.c中的接口:
已提供Linux系统的参考实现:

单独预留的KM安全分区大于2K, 且需保证在系统升级和重启时,分区数据不被破坏。
ls_hal_get_id接口,需使用设备硬件唯一标识。
第三步:HAL接口测试:
修改makefile.rules的编译配置文件:
配置目标平台(pLat := xxx)。
CROSS_COMPILE设置对应的编译工具链。
CFLAGS设置编译的配置参数。
执行编译"make clean & make"。
正确运行程序hal_test,可得到如下成功日志:
"HAL Key Management Test Pass"。
设备端集成:
调用设备端ID²的接口,完成相应的设备认证、数据加密等安全功能。
ID²空发:

ID² 产品信息导入:
ID²空发需要产品标识PK和产品密钥PS。
ID²产品信息,可在ID²品详情页面查看(IoT安全中心->资产管理->直连设备)。
ID²设备端SDK 初始化:
调用ID²设备端id2_client_init接口。
调用ID²设备端SDK的第一个接口,同个应用只需调用一次。
ID² 烧录状态查询:
调用ID²设备端id2_client_get_prov_stat接口。
接口成功返回,通过参数is_prov判断烧录状态,当is_prov为false时,才需要进行ID²空发请求。
ID² 空发请求:
调用ID²设备端id2_client_get_otp_auth_code接口(PS作为输入参数)。
生成的ID² AuthCode通过设备连云通道,发送到SP Server。
SP Server调用ID²服务端OtpGetId2接口,申请ID² 空发数据。
ID² 空发烧录:
先对ID² 空发数据进行Base64解码。
调用ID² 设备端id2_client_load_otp_data接口,完成ID²空发数据的解密、校验和安全存储。
ID²设备端SDK退出:
当ID² 处理完成时,最后需调用ID² 设备端id2_client_cleanup接口,完成ID²资源的清理。
Sample Code:
sample/id2/id2_sample.c -> id2_sample_process_provisioning()。
ID²认证:

ID² 产品信息导入:
ID²空发需要产品标识PK和产品密钥PS。
ID²产品信息,可在ID²品详情页面查看(IoT安全中心->资产管理->直连设备)。
ID²设备端SDK 初始化:
调用ID²设备端id2_client_init接口。
调用ID²设备端SDK的第一个接口,同个应用只需调用一次。
ID² 服务端挑战字获取:
调用ID²设备端id2_client_get_id接口,获取设备端ID² ID。
生成的ID² ID通过设备连云通道,发送到SP Server。
SP Server调用ID²服务端GetServerRandom接口,申请ID²服务端挑战字。
ID²挑战字只能使用一次,每次设备认证时,都需重新申请ID²服务端挑战字。
ID² 设备认证请求:
调用ID²设备端id2_client_get_challenge_auth_code接口(Challenge作为输入参数)。
生成的ID² AuthCode通过设备连云通道,发送到SP Server。
SP Server生成会话密钥SessionKey。
SP Server调用ID²服务端VerifyAndEncrypt接口,先进行ID²设备认证,再加密会话密钥。
ID² 下发密钥解密:
先对ID²加密的会话密钥进行Base64解码。
调用ID² 设备端id2_client_decrypt接口,完成会话密钥的解密。
ID²设备端SDK退出:
当ID² 处理完成时,最后需调用ID² 设备端id2_client_cleanup接口,完成ID²资源的清理。
Sample Code:
sample/id2/id2_sample.c -> id2_sample_device_identify_authentication()。
3.5 服务端对接:
获取AccessKey:
AccessKey是调用阿里云API的身份凭证,请参见获取AccessKey。需要注意的是AccessKey的归属账号必须与创建产品时的账号保持一致。
如果您使用RAM子账号,请确保子账号已经被授予AliyunIOTIDFullAccess权限。
安装SDK:
项目中需要引入2个依赖包:阿里云Java SDK公共包、ID²设备端SDK包。
添加Maven项目依赖,引入阿里云Java SDK公共包:
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.6</version>
</dependency>
导入ID²服务端SDK中的aliyun-java-sdk-id2-1.1.2.jar到项目工程中。
初始化SDK:
String accessKey = "${accessKey}";
String accessSecret = "${accessSecret}";
IClientProfile profile = DefaultProfile.getProfile("${RegionId}", accessKey, accessSecret);
DefaultAcsClient client = new DefaultAcsClient(profile);
参数 | 说明 |
accessKey | 您账号的AccessKey ID。 |
accessSecret | 您账号的AccessKey Secret。 |
profile | profile对象用于存放SDK初始化信息,其中${RegionId}是您的IoT设备身份认证服务的地域代码,如华东2(上海)为"cn-shanghai"。 您可以在IoT安全中心左上方查看当前服务所在地域。 地域代码的表达方法,请参见地域和可用区。 |
发起调用:
ID²服务端SDK为每个API封装了一个类,命名为${API名称}+"Request",如VerifyRequest,用于API的调用请求。
ID²服务端API列表请参见ID²服务端API手册。
本文以调用Verify接口做设备认证码校验为例:
VerifyRequest request = new VerifyRequest();
request.setApiVersion(apiVersion);
request.setProductKey(productKey);
request.setId2(id2);
request.setAuthCode(authCode);
request.setExtra(extra);
try {
VerifyResponse response = client.getAcsResponse(request);
System.out.println(response.getCode());
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
接口返回code值为200表示成功,其他code值请参考ID²服务端错误码。
更详细的调用示例,请参见ID²服务端SDK中的示例代码。
3.6 调试验证:
ID²自主验证:
ID²自主验证前,确保设备上已有ID²;如不存在,请先基于ID²空发流程,下发ID²到设备上。
设备端工具生成验证报文:
编译生成自主验证的固件(id2_app)
将自主验证的固件烧录到设备中,得到如下验证报文:

在控制台验证设备端报文:
登录IoT安全中心。
选择资产管理 > 直连设备 ,选择对应产品的“ID²接入指引”。
在“集成安全SDK”步骤单击设备端适配验证工具,将设备端生成的调试结果粘贴在验证调试结果对话框。
单击验证,开始设备端适配验证。
验证完成后,在完成验证对话框查看验证结果。
设备端验证认证码和解密:
获取服务端生成的服务端认证码(如有)和密文。
在设备端导入服务端认证码和密文:

在设备端进行验证:
重新编译生成固件(id2_app)。
烧录固件到设备。
运行固件,进行验证:
设备日志 "ID2 Client Test Decrypt Pass.": 验证通过。
设备日志 "ID2 Client Test Decrypt Fail." :验证失败。
基于客户业务通道,在集成ID²的业务功能中,进行ID²的整体功能调试;联调过程中,如出现ID²的错误,请根据ID²设备端和服务端接口的错误码进行排查。