1.总体架构
1.1 系统组成部分
1)NB-IOT物联网应用终端设备接入系统架构有4个主要部分:NB-IOT应用终端,NB-IOT安全使能服务,NB-IOT应用设备接入网关、应用端。
2)终端中的NB SIM卡中集成了SE芯片。SE芯片中的applet提供终端信息安全相关能力和算法。
3)电信NB-IOT安全使能服务中包括物盾平台及应用接入平台,物盾平台负责终端与业务平台对接,对设备上报的数据进行身份认证和数据解密,对业务平台下发的控制指令进行数字签名和指令加密。
4)在设备接入平台端部署集成物盾平台的SDK包(HTTP接口),SDK包提供业务平台平台与物盾平台的安全通信,接入平台只需要调用软盾本地接口即可使用物盾平台的加解密服务。
2.秘钥初始化
2.1 导入数据
将卡商提供的ICCID(20位)和对称秘钥存入物盾应用数据库(写插入语句即可。)
- 卡内置有业务平台公钥P(不提供),对称秘钥K1(卡商提供)。
- 物盾平台将ICCID和K1存入数据库
2.2 数据注册
注册流程
模组在注册NB平台后,获取SIM卡的初始化注册状态,如未初始化注册,则启动注册流程。
- 模组确认SIM卡未注册,启动注册。(对应上图12)
- SIM卡注册完成,向模组发送D`,MAC,ICCID(SIM GET REGISTRY响应报文数据)
- 注册完成后,模组向AEP平台发送数据。(对应上图15)
// 1. 打开 channel
AT+CCHO=D1560000405010735910070000000003
OK
// 2. 获取状态 在1通道上 42是apdu长度42位数字 发送选择应用指令固定值表明物盾应用
AT+CGLA=1,42,01A4040010D1560000405010735910070000000003
+CGLA: 4,6101 //6101 有数据返回 请终端发送C0指令获取数据
// 3. 在1通道上,发送01C0指令获取数据
AT+CGLA=1,10,"01C0000001"
+CGLA: 6,029000 //6指令长度 9000表示正确执行,02表示已注册,00未注册,01注册中。
// 4. 写入注册完成 对应北向下发注册成功的指令,将卡状态由1改2
AT+CGLA=1,8,"81F00000"
+CGLA: 4,9000
// 5. 发送加密数据到AEP平台,1,加密并发送到平台 1,待加密数据长度 11,待加密数据
AT+QENCRYPT=1,1,11
OK
2.3 模组与AEP平台交互的数据帧格式
该部分定义了模组与AEP平台帧协议。
模组发送注册数据帧:
7E | 01 | iccId(20Byte) | Length(2Byte) | Xor(1Byte) | Payload-实际注册数据(n Byte) |
---|
例:
7e0138393836313131393230383030303730343231395270
8986111920800070421995437573e24ae64a5cec85aed84ae8abadb8b1ef94282d14c9946a24123717843c8ea0099ca60bcb2c6953088fe583a9a32dfc5f5dd5873e640fe133724f8a2d9832a4276d0fb476
00
帧解释:
7e
- Flag: 标志字段,固定为7E(126), 占用1个字节。
01
- Type: 数据类型指示字段, 占用1个字节。
- 0x01: 物盾平台注册;
- 0x02: 模组上传密文数据;
- 0x03: 模组上传明文数据或者混合数据;
- 0x81: 物盾平台注册应答;
- 0x82 : NB-IoT平台下发密文数据
- 0x83: NB-IoT平台下发明文或者混合数据
3839383631313139323038303030373034323139
- ICCID:卡号,占用20个字节(89861119208000704219)
52
- Length: 数据长度指示字段。 占用1个字节。 表示Payload字段长度。
70
- Xor: 异或字段. 占用1个字节, Payload字段异或。
8986111920800070421995437573e24ae64a5cec85aed84ae8abadb8b1ef94282d14c9946a24123717843c8ea0099ca60bcb2c6953088fe583a9a32dfc5f5dd5873e640fe133724f8a2d9832a4276d0fb476
- Payload:实际注册数据(即调用物盾注册接口所需要的encData)
00
- 暂不清楚作用。
2.4 调用物盾注册接口
将P3,meId存入物盾数据库(对应上图18-20步骤)
注册接口文档
url: https://ip:port/wd/register
请求参数:
参数名 | 类型 | 说明 |
---|---|---|
appkey | String | 应用appKey(保存在物盾数据库) |
encData | String | SIM GET REGISTRY响应报文数据(即模组上报到AEP平台的payload) |
meId | String | 模组IMEI |
sign | String | 签名 (参数按照字典顺序拼接计算出sign',+appSecret计算md5后的值) |
响应结果:
{
"code": 200,
"msg": "SUCCESS",
"data": {
"meId": "867726034396442"
},
"version": "1.0"
}
数据库值:
2.5 数据注册状态确认
确保SIM卡将公钥P3保存到物盾数据库
注册状态接口文档
url:https://ip:port/wd/state
请求参数:
参数名 | 类型 | 说明 |
---|---|---|
appkey | String | 应用appKey(保存在物盾数据库) |
iccId | String | iccId |
meId | String | 模组IMEI |
sign | String | 签名 (参数按照字典顺序拼接计算出sign',+appSecret计算md5后的值) |
响应结果:
{
"code": 200,
"msg": "SUCCESS",
"data": null,
"version": "1.0"
}
3. 加密数据上传及调用物盾接口解密
数据加解密流程
3.1 加密数据上传
加密数据不能大于54个字节
- 1个十六进制占4位(bit),1个字节(B)占8位(bit),所以一个十六进制占0.5个字节,即一个字节可以表示两个十六进制(2个十六进制 = 1个字节)
// 1,加密并发送到平台 54,待加密数据长度 01000.....,待加密数据
AT+QENCRYPT=1,54,010000000401E8764701020305000905001F00131A06000102030405060708090A0B0C0D0E0F101112131415161707E207010B1F0701
AEP平台收到模组上传数据。
3.2 模组与AEP平台交互的数据帧格式
根据帧协议截取出加密值。(即调用物盾接口所需的encData)
9a2ca23af4afedbeafff0167f753ff7cf0bdd0147c5e96dd6220885a51f2c060490ba3f067ebbd78d13d25768831ab9dbc0ab8a3e227b187903510ab88fe68c7fde5fbd79929f9a6d868616dbb8cd63c27886d0c2cd148ad94224fd1f06fc7097dc3a166987fd7964ba2cca6239703d9c145a1c32f3796e78d62e58d04be54943a170f5b93f20895324b5e3693c02db38d8bc4e67bb0cf8de4ffeda55d1a2fe9fe347485b82f266a6e8c968dc2911223005f9f6df67342df9f45d6e16c0a2b4f4ed7542b4b8202e24a893a290748a01cf2997c73e0517315b35275
3.3 调用物盾接口对数据进行解密
对模组上报到AEP平台的加密数据进行解密获取初始值
解密数据接口文档
url:https://ip:port/wd/data/upload
请求参数:
参数名 | 类型 | 说明 |
---|---|---|
appkey | String | 应用appKey(保存在物盾数据库) |
encData | String | SIM SECURE DATA响应报文数据域(即模组上报到AEP平台的payload) |
iccId | String | 卡ICCID |
sign | String | 签名 (参数按照字典顺序拼接计算出sign',+appSecret计算md5后的值) |
响应结果:
{
"code": 200,
"msg": "SUCCESS",
"data": {
"originalData": "00000002010000000401E8764701020305000905001F00131A06000102030405060708090A0B0C0D0E0F101112131415161707E207010B1F0701"
},
"version": "1.0"
}
``00000002``表示通讯次数。