使用ID²-SE将设备接入自建的物联网系统
本文介绍了设备如何通过更安全的身份认证方式(ID²)连接到您自建的物联网系统(设备管理平台)。适用于集成了ID²安全芯片的设备。
1. 术语
- Soft-KM(Key Management)密钥管理,由阿里提供的软件安全沙箱,基于软件加固和虚拟化技术提供对密钥(IoT ID²)的安全保护。 
- 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指令,终端设备和外设模块之间的连接和通信的指令。 
- ID²安全芯片,或ID²-SE芯片,在安全芯片生产时烧录ID²密钥,基于安全芯片的物理防护特性保护ID²密钥的存储和运行安全,通过SE AT指令提供ID²密钥的基础运算。 
2. 产品架构

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

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

3.2 购买ID²:
- 购买ID²安全元器件: 
- 点击购买链接 - ID²安全元器件。 
- 选择硬件类型、型号和数量: 

3.3 创建产品:
- 登录产品控制台,在左侧导航栏,选择常规>集成与部署 > IoT设备身份认证,单击独立使用(三方物联网平台)卡片的开始接入按钮。 

- 在配置产品页面创建新产品&分配ID²授权,然后单击下一步按钮。 
- 选择产品:请选择创建新产品,并输入产品名称。 
- ID²有效期:请选择1年、3年、或5年。 
- 分配ID²授权数量:填写实际的设备数量,不超过账号下可分配ID²的数量。 

3.4 选择设备认证算法:
IoT设备身份认证支持国际算法(AES-128、AES-192、AES-256)和国密算法(SM1-128、SM2-256、SM4-128),能满足企业不同安全等级的需求。
说明
国密算法SM1需要配合ID²安全芯片使用,SM2用于业务数据完整性校验和加密。
创建的ID²产品默认选择的设备认证算法是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 | ID²云端的示例代码 | 
| lib | ID²云端的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);- 发起调用,ID²云端SDK为每个API封装了一个类,命名为${API名称}+"Request",如VerifyRequest,用于API的调用请求,ID²云端API列表请参考服务端API。 
- ID²空发 
OtpGetId2Request request = new OtpGetId2Request();
request.setDeviceAuthCode(authCode);
request.setApiVersion(1.1.2);
OtpGetId2Response response = client.getAcsResponse(request);- 获取ID²认证挑战字 
GetServerRandomRequest request = new GetServerRandomRequest();
request.setId2(id2Id);
request.setApiVersion(1.1.2);
GetServerRandomResponse response = client.getAcsResponse(request);
System.out.println("GetServerRadom requestId:" + response.getRequestId());- ID²设备认证和业务密钥加密 
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());- 应用集成ID²云端SDK的示例代码,请参考demos/ID2SPDemo 
3.6 集成设备端SDK:
3.6.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.6.2 下载设备端SDK:
- ID² SDK下载: 
- ID² Release Package目录: 
| 目录/文件 | 说明 | 
| modules | 核心模块代码 | 
| include | 头文件 | 
| app | 测试代码,可用于集成调试 | 
| sample | ID²的示例代码 | 
| doc | 文档 | 
| make.settings | ID² SDK统一配置文件: 
 | 
| make.rules | 编译系统配置文件,可配置编译工具链和编译参数 | 
| makefile | 编译脚本 | 
3.6.3 集成设备端SDK:

- 设备硬件及系统层集成, 详情请参考ID²安全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 
- 设备应用首先调用ID²的初始化函数,完成设备端SDK的初始化。 
{
    int ret;
     ret = id2_client_init();
     if (ret != IROT_SUCCESS) {
        ls_osa_print("id2 client init fail, %d\n", ret);
        return -1;
     }
}- 获取设备端的ID² ID。 
{
    int ret;
     ret = id2_client_init();
     if (ret != IROT_SUCCESS) {
        ls_osa_print("id2 client init fail, %d\n", ret);
        return -1;
     }
}- ID²认证挑战字的网络请求和响应。 
{
    int ret;
     ret = id2_client_init();
     if (ret != IROT_SUCCESS) {
        ls_osa_print("id2 client init fail, %d\n", ret);
        return -1;
     }
}- 获取设备端的ID²认证码。 
{
    int ret;
     ret = id2_client_init();
     if (ret != IROT_SUCCESS) {
        ls_osa_print("id2 client init fail, %d\n", ret);
        return -1;
     }
}- 设备端认证和数据加密的网络请求和响应。 - cipherData:ID²云端下发的加密数据 
 
{
    int ret;
     ret = id2_client_init();
     if (ret != IROT_SUCCESS) {
        ls_osa_print("id2 client init fail, %d\n", ret);
        return -1;
     }
}- 解密ID²云端加密下发的数据。 
{
    int ret;
     ret = id2_client_init();
     if (ret != IROT_SUCCESS) {
        ls_osa_print("id2 client init fail, %d\n", ret);
        return -1;
     }
}- 设备端SDK的编译: 
- 在ID² SDK的根目录,执行命令vi ./make.settings打开文件: - 修改CONFIG_LS_ID2_ROT_TYPE的值为SE 
- 修改CONFIG_LS_ID2_KEY_TYPE的值,同ID²产品选择的认证算法保持相同 
 

- 执行命令“make clean & make plat=xxx”进行编译 - Linux x86_64默认使用系统中的GCC作为编译工具,且默认指定“plat=x86_64”参数 
- 如要编译其他架构,如armhf,在make.rules中配置编译工具,运行编译命令“make clean & make plat=armhf” 
 

3.7 业务数据加密
- 运行设备端自有的应用和自建的SPDemo Server,进行ID²认证和加密,以及业务数据加密的调试。 
- 查看设备状态: 
- 登录产品控制台,在左侧导航栏,选择资产>设备,查看设备状态为正常,安全状态为安全。 
