首页 IoT设备身份认证 最佳实践 使用ID²-SE将设备接入自建的物联网系统

使用ID²-SE将设备接入自建的物联网系统

本文介绍了设备如何通过更安全的身份认证方式(ID²)连接到您自建的物联网系统(设备管理平台)。适用于集成了ID²安全芯片的设备。

1. 术语

  1. Soft-KM(Key Management)密钥管理,由阿里提供的软件安全沙箱,基于软件加固和虚拟化技术提供对密钥(IoT ID²)的安全保护。

  2. OSA(Operation System Abstractor Layer)操作系统抽象层,定义内存申请和释放、日志打印、系统时间、网络通信等接口,非遵循POSIX标准的OS,需重新适配这些接口。

  3. HAL(Hardware Abstractor Layer)硬件抽象层,根据设备硬件特性,完成对加解密算法、设备唯一ID、密钥管理和数据安全存储的接口适配。

  4. TLS(Transport Layer Security)安全传输层协议, 用于两个通信实体之间,保护通信数据的私密性和完整性。

  5. IoT(Internet of things)物联网,基于互联网实现万物互联。

  6. LP(Link Platform)阿里云物联网平台,提供物联网的设备管理。

  7. SE(Secure Element)安全元件,也称安全芯片,单独的防篡改硬件,专门用于存储和数据加密。

  8. AT指令,终端设备和外设模块之间的连接和通信的指令。

  9. ID²安全芯片,或ID²-SE芯片,在安全芯片生产时烧录ID²密钥,基于安全芯片的物理防护特性保护ID²密钥的存储和运行安全,通过SE AT指令提供ID²密钥的基础运算。

2. 产品架构

  1. ID²控制中心:

  • ID²的Web控制台,提供对ID²产线灌装、ID²产品和配额申请、以及ID²使用统计的管理。

  1. ID²服务中心:

  • ID²在云端的应用,提供ID²的各种安全能力,包括ID²密钥安全分发、设备认证、基于ID²的安全连接协议等;同时,提供各种能力的云端接口,支持业务平台的二次开发,支持不同的安全业务需求和场景。

  1. ID² Client SDK(ID²设备端SDK):

  • ID²在设备端的功能组件和软件开发框架,可支持不同操作系统和不同硬件,为IoT设备提供基于ID²的端到端的设备认证、数据加解密等各种安全能力。

4. ID²接入流程

4.1 概述

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

  • ID²对接步骤如下:

4.2 创建产品

  1. 登录IoT安全中心

  2. 选择资产管理->直连设备->创建产品:

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

  • 填写自定义的产品名称,选择合适的密钥类型:

  • 密钥类型下拉列表中,选择需要的密钥类型:

  • AES-128

  • AES-192

  • AES-256

  • 3DES-112

  • 3DES-168

  • SM4-128

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

4.3 购买ID²

  1. 购买ID²安全元器件:

4.4 设备端对接

4.4.1 ID²设备端SDK框架:

  1. IoT Application:

  • 设备端的应用程序,负责业务数据处理,包括设备认证、设备建连和数据收发等。

  1. IoT Linkkit:

  • 阿里云物联网平台的接入SDK,提供IoT设备安全连接到阿里云IoT平台,提供数据连云的安全通道,以及业务数据的管理。

  1. ID² Client SDK:

  • ID²:IoT设备认证的对外接口,上层应用/协议基于此接口进行开发。

  • KM:密钥管理模块,支持不同形式的载体:

  • Soft-KM:软件沙箱,基于软件加固和虚拟化技术提供对ID²密钥的安全保护。

  • SE:安全芯片,基于物理防护机制,提供对ID²密钥的安全保护,通过AT指令对设备提供ID²的运算。

  • Crypto:提供统一的加解密算法接口。

  • OSA:操作系统适配接口,厂商需根据使用的OS,重新进行接口适配。

  • HAL:硬件适配接口,提供算法库和Soft-KM的适配接口,厂商需根据选择的硬件平台,重新进行接口适配。

3.4.2 ID²设备端SDK获取:

  1. ID²设备端SDK下载:

  1. ID² Release Package目录:

目录/文件

说明

modules

核心模块代码

include

头文件

app

测试代码,可用于集成调试

sample

ID²的示例代码

doc

文档

make.settings

ID²设备端SDK统一配置文件:

  • CONFIG_LS_ID2_DEBUG:调试开关

  • CONFIG_LS_ID2_ROT_TYPE:ID²安全载体,SE-安全芯片,MDU-安全模组

  • CONFIG_LS_ID2_KEY_TYPE:ID²的密钥类型

make.rules

编译系统配置文件,可配置编译工具链和编译参数

makefile

编译脚本

3.4.3 ID²设备端SDK对接:

  1. 设备端适配:

根据选择的OS和硬件平台,完成ID²设备端SDK的移植。

image.png

  • 基于ID² 开源SDK进行移植,OSA和IROT HAL需进行重新适配。

第一步:OSA接口适配:

  • 实现src/osa/ls_osa.c中的接口:

  • 已提供Linux系统的参考实现可只实现其中的基础接口和网络接口。

第二步: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关闭。

第三步:ID²设备端SDK编译:

  • 修改ID²设备端SDK根目录make.rules的编译脚本:

  • CROSS_COMPILE设置对应的编译工具链。

  • CFLAGS设置编译的配置参数。

  • 修改ID²设备端SDK根目录make.settings的统一配置:

  • CONFIG_LS_ID2_ROT_TYPE :配置为SE。

  • CONFIG_LS_ID2_KEY_TYPE:配置为ID²安全芯片中的密钥类型。

  • CONFIG_LS_ID2_ECDP_TYPE:如ID²密钥类型为ECC时,配置对应的椭圆曲线参数。

  1. 设备端集成:

调用设备端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 服务端对接

  1. 获取AccessKey:

  • AccessKey是调用阿里云API的身份凭证,请参见获取AccessKey。需要注意的是AccessKey的归属账号必须与创建产品时的账号保持一致。

  • 如果您使用RAM子账号,请确保子账号已经被授予AliyunIOTIDFullAccess权限。

  1. 安装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到项目工程中。

  1. 初始化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安全中心左上方查看当前服务所在地域。

地域代码的表达方法,请参见地域和可用区

  1. 发起调用:

  • 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.5 调试验证:

  1. ID²自主验证:

  • ID²自主验证前,确保设备上已有ID²;如不存在,请先基于ID²空发流程,下发ID²到设备上。

设备端工具生成验证报文:

  • 编译生成自主验证的固件(id2_app)

  • 将自主验证的固件烧录到设备中,得到如下验证报文:

在控制台验证设备端报文:

  • 登录IoT安全中心

  • 选择资产管理 > 直连设备 ,选择对应产品的“ID²接入指引”

  • 在“集成安全SDK”步骤单击设备端适配验证工具,将设备端生成的调试结果粘贴在验证调试结果对话框。

  • 单击验证,开始设备端适配验证。

  • 验证完成后,在完成验证对话框查看验证结果。

设备端验证认证码和解密:

  • 获取服务端生成的服务端认证码(如有)和密文。

在设备端导入服务端认证码和密文:

在设备端进行验证:

  • 重新编译生成固件(id2_app)。

  • 烧录固件到设备。

运行固件,进行验证:

  • 设备日志 "ID2 Client Test Decrypt Pass.": 验证通过。

  • 设备日志 "ID2 Client Test Decrypt Fail." :验证失败。

  1. 基于客户业务通道,在集成ID²的业务功能中,进行ID²的整体功能调试;联调过程中,如出现ID²的错误,请根据ID²设备端和服务端接口的错误码进行排查。

阿里云首页 IoT设备身份认证 相关技术圈