使用ID²-KM将设备接入阿里云物联网平台(LP)
本文介绍了设备如何通过更安全的身份认证方式(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)物联网,基于互联网实现万物互联。
阿里云物联网平台 LP(Link Platform)阿里云物联网平台,提供物联网的设备管理。
2. ID²产品架构

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

阿里云物联网平台接入的方式,ID²已默认同物联网平台打通,因此不需要进行服务端对接。
设备建连的过程,IoT设备通过物联网设备端Linkkit SDK调用ID²-iTLS,进行设备认证和会话密钥协商,最后建立数据安全传输通道。
设备建连成功后,IoT设备和物联网平台,通过安全通道进行应用数据的安全传输。
ID²对接步骤如下:

3.2 创建产品:
登录阿里云物联网平台控制台。
点击选择的实例,在左侧导航栏,选择设备管理 > 产品,单击创建产品:

填写产品信息,认证方式选择ID²:

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

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

IoT Application:
设备端的应用程序,负责业务数据处理,包括设备认证、设备建连和数据收发等。
IoT Linkkit:
阿里云物联网平台的接入SDK,提供IoT设备安全连接到阿里云IoT平台,提供数据连云的安全通道,以及业务数据的管理。
ID² Client SDK:
iTLS:轻量的安全连接协议TLS,基于ID²完成TLS的握手认证和密钥协议,提供应用数据的收发。
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² 设备端 SDK 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²的接口,完成相应的设备认证、数据加密等安全功能。
第一步:下载Linkkit代码:

第二步:在Linkkit根目录,新建libs目录,并将已适配好的ID²静态库拷贝到libs目录:

第三步:修改Linkkit 配置:
在Link_SDK目录内, 打开./core/sysdep/core_adapter.c, 关闭宏CORE_ADAPTER_MBEDTLS_ENABLED。
第四步:修改Linkkit Makefile,链接ID²静态库:

第五步:修改示例代码中的产品信息:
demos/mqtt_id2_demo.c:

第六步:固件编译:
根目录重新执行编译,正确编译,可生成output/mqtt-id2-demo可执行文件。
第七步:固件运行:
正确运行mqtt-id2-demo,可得到如下日志:

3.5 调试验证:
ID²建连错误调试:
ID²-iTLS建连失败时,首先可以通过查看消息警告(alert message)进行问题排查:

上面的消息警告中,2 - FATAL类型的警告;172 - 消息警告类型,ID²-iTLS常见的错误警告类型如下:
错误码 | 错误信息 | 评论 |
160 | ID² generic error | 通用错误,检查Product Secret是否正确 |
161 | ID² no quota | ID²配额不足,需先购买ID² |
162 | ID² is not exist | 服务端识别不了此ID²,可删除设备上ID²(如KM载体)后,重新空发ID² |
163 | ID² authcode is invalid | ID²认证码错误,校验挑战字是否有效(ID²服务端申请&只使用一次) |
164 | ID² has not been activated | ID²已经激活 |
165 | The timestamp used in authcode is expired | 检查设备端时间是否同步 |
166 | ID² challenge is invalid | ID²认证码中,挑战字非法(挑战字模式) |
167 | Not support this operation | 不支持此操作 |
168 | ID² has been suspended | ID²已暂停使用 |
169 | ID² has been discarded | ID²已废弃 |
170 | Permission denied, id2 has been blinded to other product key | ID²已绑定到其他产品,不容许在该产品使用;改回绑定的产品,或者删除设备上的ID²,再重新空发一个新的ID² |
171 | Product key is invalid | ID²产品非法,如已废弃 |
172 | Product key is not exist | ID²产品不存在,产品错误填入,或者申请产品时,没有选择"ID²认证" |
ID²设备上线验证:
设备端ID²-iTLS建连成功后,在物联网管理平台,可看到新创建的设备和设备的上线信息。
登录物联网平台控制台。
在左侧导航栏,选择设备管理 > 设备,DeviceName是ID²示例中设置的设备证书(ProductKey、DeviceName、DeviceSecret)设备名。
