一种物联网终端设备的注册和连接实现方法及装置与流程

未命名 08-13 阅读:57 评论:0


1.本发明涉及信息安全领域,尤其涉及一种物联网终端设备的注册和连接实现方法及装置。


背景技术:

2.物联网高速发展的今天涌现出非常多的终端设备厂商,各厂商对安全协议大多为自定义实现方案,这种自定义实现方案缺乏统一标准,且各终端设备的实现大多为业务和安全交叉,各厂商的终端设备在生产、运输、认证和安全机制方面均不一致,无法保证设备注册和连接的安全性,故亟需提供一种安全可靠便捷的注册和连接方法。


技术实现要素:

3.本发明的目的是为了克服现有技术的不足,提供一种物联网终端设备的注册和连接实现方法及装置。
4.第一方面,本发明实施例提供了一种物联网终端设备的注册和连接实现方法,适用于包含sdk、se、上层应用的终端设备,所述终端设备上电之后所述方法包括:步骤s1:当所述sdk接收到所述上层应用的调用时,判断sdk的状态,如为空闲则给所述上层应用返回空闲状态,执行步骤s12,如为非空闲则给所述上层应用返回非空闲状态,在接收到所述上层应用发送的运行请求时判断sdk的非空闲状态的类型,如为制造前则执行步骤s2,如为载入前则执行步骤s6,如为转让前则执行步骤s8,所述sdk的状态的初始值为非空闲状态的制造前;步骤s2:所述sdk判断是否保存有设备公钥,是则执行步骤s3,否则通知所述se生成设备密钥对,执行步骤s3;步骤s3:所述sdk使用所述se中的设备私钥对设备标识进行签名得到第一签名结果,根据所述第一签名结果、所述设备标识和设备公钥生成设备初始化启动请求,根据预置的制造站地址将所述设备初始化启动请求发送给制造站;步骤s4:所述sdk对接收到的所述制造站返回的设备归属信息的头部进行解析得到制造站公钥、认证中心地址和设备证书并保存,通过所述se对所述设备归属信息的头部进行hmac计算,将设备归属信息的头部hmac值发送给所述制造站;步骤s5:所述sdk接收到所述制造站返回的成功响应后对所述制造站公钥计算哈希得到制造站公钥哈希值,将所述制造站公钥哈希值与所述设备归属信息的头部hmac值对应保存在所述se中,将sdk的非空闲状态设置为载入前,执行步骤s6;步骤s6:所述sdk根据设备标识生成载入请求并发送给认证中心,对接收到的所述认证中心返回的载入请求响应进行解析得到第一随机数,通过所述se中的设备私钥对所述第一随机数和设备标识进行签名得到第二签名结果,根据所述第一随机数、所述设备标识和所述第二签名结果生成身份验证请求并发送给所述认证中心;步骤s7:所述sdk接收到所述认证中心返回的重定向信息并保存,将sdk的非空闲
状态设置为转让前,执行步骤s8;步骤s8:所述sdk根据设备标识、所述se生成的第二随机数生成设备连接请求,根据保存的重定向信息中的推送服务地址将所述设备连接请求发送给对应的推送服务;步骤s9:所述sdk对接收到的所述推送服务返回的设备连接响应中的数据进行验证,如验证成功则通过所述se中的设备私钥对所述设备标识和密钥交换参数进行签名得到第三签名结果,保存所述设备连接响应中的第三随机数,根据所述设备标识、密钥交换参数、第三签名结果和所述第三随机数生成设备证明请求并发送给所述推送服务;步骤s10:当所述sdk接收到所述推送服务返回的设备归属信息重置请求时根据所述密钥交换参数生成第二密钥,使用所述第二密钥对所述设备归属信息重置请求进行解密并验证解密结果,如验证成功则判断解密结果中的第三随机数和保存的第三随机数是否一致,是则对所述设备归属信息重置请求中的设备归属信息进行hmac计算得到第二hmac值,对所述设备归属信息重置请求中的推送服务公钥计算哈希值,并将推送服务公钥哈希值和所述第二hmac值缓存在所述se中;步骤s11:所述sdk将设备状态变化通知发送给所述推送服务,当接收到所述推送服务返回的确认响应时用所述第二hmac值替换所述se中保存的设备归属信息的头部hmac值,给所述上层应用返回运行请求响应,将sdk状态设置为空闲并返回给所述上层应用,执行步骤s12;步骤s12:当所述上层应用接收到所述sdk返回的空闲状态时,所述上层应用根据所述设备标识和所述第二密钥生成长连接请求并发送给推送服务,当接收到所述推送服务返回的连接成功响应时与所述推送服务建立长连接。
5.第二方面,本发明实施例又提供一种物联网终端设备的注册和连接实现装置,包括:第一判断发送模块,用于当所述sdk接收到所述上层应用的调用时,判断sdk的状态,如为空闲则给所述上层应用返回空闲状态,触发发送接收建立模块,如为非空闲则给所述上层应用返回非空闲状态,在接收到所述上层应用发送的运行请求时判断sdk的非空闲状态的类型,如为制造前则触发判断生成模块,如为载入前则触发第二签名生成发送模块,如为转让前则触发第一生成发送模块,所述sdk的状态的初始值为非空闲状态的制造前;所述判断生成模块,用于判断是否保存有设备公钥,是则触发第一签名生成发送模块,否则通知所述se生成设备密钥对,触发第一签名生成发送模块;所述第一签名生成发送模块,用于使用所述se中的设备私钥对设备标识进行签名得到第一签名结果,根据所述第一签名结果、所述设备标识和设备公钥生成设备初始化启动请求,根据预置的制造站地址将所述设备初始化启动请求发送给制造站;接收保存计算模块,用于对接收到的所述制造站返回的设备归属信息的头部进行解析得到制造站公钥、认证中心地址和设备证书并保存,通过所述se对所述设备归属信息的头部进行hmac计算,将设备归属信息的头部hmac值发送给所述制造站;第一接收保存设置模块,用于接收到所述制造站返回的成功响应后对所述制造站公钥计算哈希得到制造站公钥哈希值,将所述制造站公钥哈希值与所述设备归属信息的头部hmac值对应保存在所述se中,将sdk的非空闲状态设置为载入前,触发第二签名生成发送模块;
所述第二签名生成发送模块,用于根据设备标识生成载入请求并发送给认证中心,对接收到的所述认证中心返回的载入请求响应进行解析得到第一随机数,通过所述se中的设备私钥对所述第一随机数和设备标识进行签名得到第二签名结果,根据所述第一随机数、所述设备标识和所述第二签名结果生成身份验证请求并发送给所述认证中心;第二接收保存设置模块,用于接收到所述认证中心返回的重定向信息并保存,将sdk的非空闲状态设置为转让前,触发第一生成发送模块;所述第一生成发送模块,用于根据设备标识、所述se生成的第二随机数生成设备连接请求,根据保存的重定向信息中的推送服务地址将所述设备连接请求发送给对应的推送服务;验证生成发送模块,用于对接收到的所述推送服务返回的设备连接响应中的数据进行验证,如验证成功则通过所述se中的设备私钥对所述设备标识和密钥交换参数进行签名得到第三签名结果,保存所述设备连接响应中的第三随机数,根据所述设备标识、密钥交换参数、第三签名结果和和所述第三随机数生成设备证明请求并发送给所述推送服务;生成验证保存模块,用于当接收到所述推送服务返回的设备归属信息重置请求时根据所述密钥交换参数生成第二密钥,使用所述第二密钥对所述设备归属信息重置请求进行解密并验证解密结果,如验证成功则判断解密结果中的第三随机数和保存的第三随机数是否一致,是则对所述设备归属信息重置请求中的设备归属信息进行hmac计算得到第二hmac值,对所述设备归属信息重置请求中的推送服务公钥计算哈希值,并将推送服务公钥哈希值和所述第二hmac值缓存在所述se中;发送接收设置模块,用于将设备状态变化通知发送给所述推送服务,当接收到所述推送服务返回的确认响应时用所述第二hmac值替换所述se中保存的设备归属信息的头部hmac值,给所述上层应用返回运行请求响应,将sdk状态设置为空闲并返回给所述上层应用,触发发送接收建立模块;所述发送接收建立模块,用于当接收到所述sdk返回的空闲状态时,所述上层应用根据所述设备标识和所述第二密钥生成长连接请求并发送给推送服务,当接收到所述推送服务返回的连接成功响应时与所述推送服务建立长连接。
6.第三方面,本发明实施例又提供一种电子设备,所述电子设备包括至少一个处理器、存储器及存储在所述存储器上并可被所述至少一个处理器执行的指令,所述至少一个处理器执行所述指令以实现前述的物联网终端设备的注册和连接实现方法。
7.第四方面,本发明实施例又提供一种计算机可读存储介质,所述计算机可读存储介质包括计算机程序,当所述计算机程序在物联网设备上运行时,使得所述物联网设备执行前述的一种物联网终端设备的注册和连接实现方法。
8.第五方面,本发明实施例又提供一种芯片系统,包括芯片,所述芯片与存储器耦合,用于执行所述存储器中存储的计算机程序,以执行前述的一种物联网终端设备的注册和连接实现方法。
9.本发明与现有技术相比,具有以下优点:本发明技术方案提供一种物联网终端设备的注册和连接实现方法,其中注册过程(即制造前状态)没有推送服务的参与,连接准备过程(载入前状态和转让前状态)和长连接过程(空闲状态)没有认证中心的参与,使得攻击者在注册过程中没有办法获取终端设备想
要连接的推送服务的信息,且在连接准备过程(即认证过程)和长连接过程无法获取认证中心的信息,保证了推送服务和认证中心的安全性,可避免物联网终端设备、推送服务和认证中心遭受攻击,提高物联网终端设备注册和连接的安全性。
附图说明
10.图1为本发明实施例一提供的一种物联网终端设备的注册和连接实现方法的流程图;图2至图6为本发明实施例二提供的一种物联网终端设备的注册和连接实现方法的流程图;图7为本发明实施例三提供的一种物联网终端设备的注册和连接实现装置方框示意图。
具体实施方式
11.本技术提出了一种物联网终端设备的注册和连接实现方法及装置,下面结合附图,对本技术具体实施方式进行详细说明。所述实施例的示例在附图中示出。下面通过参考附图描述的实施例是示例性的,仅用于解释本技术,而不能解释为对本技术的限制。
12.本技术领域技术人员可以理解,除非另外定义,这里使用的所有术语(包括技术术语和科学术语),具有与本技术所属领域中的普通技术人员的一般理解相同的意义。还应该理解的是,诸如通用字典中定义的那些术语,应该被理解为具有与现有技术的上下文中的意义一致的意义,并且除非像这里一样被特定定义,否则不会用理想化或过于正式的含义来解释。
13.为使本发明的目的、技术方案和优点更加清楚,下面结合附图对本发明实施方式作进一步地详细描述。
14.在本实施例中,物联网终端设备包括:se(中文全称:安全元件,英文全称:secure element)、sdk(中文全称:软件开发工具包,英文全称:software development kit)和上层应用,三者生成的数据保存在共享存储区中。
15.其中,物联网终端设备的se主要负责数据处理(包括加解密、签名验签、计算等),物联网终端设备的sdk主要负责实现安全生产、注册和认证;物联网终端设备上层应用主要负责调度sdk、完成后续业务处理;制造站主要负责在sdk状态为制造前时为物联网终端设备嵌入设备归属信息;认证中心主要负责在sdk状态为载入前时为物联网终端设备提供注册服务;推送服务主要负责在sdk状态为转让前时为物联网终端设备提供认证,在sdk状态为空闲时与物联网终端设备建立长连接并提供业务处理服务。本实施例中的物联网终端设备可以为网络打印机、加湿器、空调等设备。
实施例一
16.本发明实施例一提供了一种物联网终端设备的注册和连接实现方法,适用于包含sdk、se、上层应用的终端设备,终端设备上电之后,如图1所示,本实施例的方法包括:步骤s1:当sdk接收到上层应用的调用时,判断sdk的状态,如为空闲则给上层应用返回空闲状态,执行步骤s12,如为非空闲则给上层应用返回非空闲状态,在接收到上层应
用发送的运行请求时判断sdk的非空闲状态的类型,如为制造前则执行步骤s2,如为载入前则执行步骤s6,如为转让前则执行步骤s8;在本实施例中,sdk的状态的初始值为非空闲状态的制造前;可选的,在本实施例中,步骤s1之前还包括:步骤a1:上层应用组装sdk初始化指令并发送给sdk;步骤a2:sdk接收到sdk初始化指令后进行初始化,组装se初始化请求并发送给se;步骤a3:se接收到se初始化请求后进行初始化,给sdk返回se初始化响应;步骤a4:sdk接收se初始化响应,组装获取se状态请求并发送给se;步骤a5:se接收到获取se状态请求后组装se状态响应并返回给sdk;步骤a6:sdk根据接收到的se状态响应中的状态码判断是否需要对se执行复位操作,是则调用se复位接口,进行se复位操作,否则组装sdk初始化响应并返回给上层应用;具体的,本实施例中的步骤s1包括:步骤s1-1:上层应用组装获取sdk状态请求并发送给sdk;步骤s1-2:sdk接收到获取sdk状态请求后,根据sdk状态组装sdk状态响应并返回给上层应用;步骤s1-3:上层应用接收sdk状态响应并解析,判断解析得到的sdk的状态的类型,如为非空闲给sdk发送运行请求,则执行步骤s1-4,如为空闲则执行步骤s12,如为错误则报错,结束;步骤s1-4:sdk判断sdk的非空闲状态的类型,如为制造前则执行步骤s2,如为载入前则执行步骤s6,如为转让前则执行步骤s8;步骤s2:sdk判断是否保存有设备公钥,是则执行步骤s3,否则通知se生成设备密钥对,执行步骤s3;具体的,在本实施例中,步骤s2包括:步骤s21:sdk判断是否保存有设备公钥,是则执行步骤s3,否则执行步骤s22;步骤s22:sdk组装生成密钥请求,将生成密钥请求发送给se;步骤s23:se接收到生成密钥请求后根据预设算法生成设备密钥对,将设备密钥对中的设备公钥返回给sdk;步骤s24:sdk接收设备公钥并保存,执行步骤s3;步骤s3:sdk使用se中的设备私钥对设备标识进行签名得到第一签名结果,根据第一签名结果、设备标识和设备公钥生成设备初始化启动请求,根据预置的制造站地址将设备初始化启动请求发送给制造站;具体的,在本实施例中,步骤s3包括:步骤s31:sdk根据设备标识、公钥类型、公钥编码、证书申请信息组装设备初始化签名请求,将设备初始化签名请求发送给se;步骤s32:se使用设备私钥对接收到的设备初始化签名请求进行签名得到第一签名结果,将第一签名结果返回给sdk;步骤s33:sdk根据接收到的第一签名结果、设备初始化签名请求和保存的设备公钥组装设备初始化启动请求,根据预置的制造站地址将设备初始化启动请求发送给制造站;
对应的,步骤s3与步骤s4之间还包括:步骤b1:制造站对接收到设备初始化启动请求进行解析得到第一签名结果、设备初始化签名请求和设备公钥,使用设备公钥和设备初始化签名请求对第一签名结果进行验签,如验签成功则对设备初始化签名请求进行解析得到设备标识、公钥类型、公钥编码、证书申请信息,根据设备标识判断是否保存有对应的设备证书,是则报错,结束,否则根据设备公钥、公钥类型、公钥编码、证书申请信息和设备标识生成设备证书并与设备标识对应保存,执行步骤b2;步骤b2:制造站根据制造站公钥、设备证书、认证中心地址、协议版本号生成设备归属信息的头部,将设备归属信息的头部发送给sdk;步骤s4:sdk对接收到的制造站返回的设备归属信息的头部进行解析得到制造站公钥、认证中心地址和设备证书并保存,通过se对设备归属信息的头部进行hmac计算,将设备归属信息的头部hmac值发送给制造站;在本实施例中,步骤s4中的通过se对设备归属信息的头部进行hmac计算,将设备归属信息的头部hmac值发送给制造站,包括:sdk根据设备归属信息的头部生成第一hmac计算请求,将第一hmac计算请求发送给se;se对接收到的第一hmac计算请求进行解析,对解析得到的设备归属信息的头部进行hmac计算,将计算得到的设备归属信息的头部hmac值返回给sdk,sdk将设备归属信息的头部和接收到的设备归属信息的头部hmac值发送给制造站;步骤s5:sdk接收到制造站返回的成功响应后对制造站公钥计算哈希得到制造站公钥哈希值,将制造站公钥哈希值与设备归属信息的头部hmac值对应保存在se中,将sdk的非空闲状态设置为载入前,执行步骤s6;在本实施例中,步骤s4与步骤s5之间还包括:制造站对保存的推送服务公钥进行哈希计算得到推送服务公钥哈希值,根据设备归属信息的头部、接收到的设备归属信息的头部hmac值和推送服务公钥哈希值组装设备归属信息并与设备标识对应保存,组装成功响应并发送给sdk;具体的,在本实施例中,步骤s5包括:步骤s51:sdk接收到成功响应后对制造站公钥计算哈希得到制造站公钥哈希值,将设备归属信息的头部hmac值和制造站公钥哈希值发送给se;步骤s52:se保存接收到的设备归属信息的头部hmac值和制造站公钥哈希值,给sdk返回存储成功响应;步骤s53:sdk接收到存储成功响应后将sdk的非空闲状态设置为载入前,给上层应用返回运行请求响应,执行步骤s6;步骤s6:sdk根据设备标识生成载入请求并发送给认证中心,对接收到的认证中心返回的载入请求响应进行解析得到第一随机数,通过se中的设备私钥对第一随机数和设备标识进行签名得到第二签名结果,根据第一随机数、设备标识和第二签名结果生成身份验证请求并发送给认证中心;具体的,在本实施例中,步骤s6包括:步骤s61:sdk根据设备标识生成载入请求,并将载入请求发送给认证中心;步骤s62:认证中心对接收到的载入请求进行解析,根据解析得到的设备标识判断是否保存有对应的协议数据,是则执行步骤s63,否则给sdk返回错误信息,结束;
步骤s63:认证中心生成第一随机数并与设备标识对应保存,根据第一随机数生成载入请求响应,将载入请求响应返回给sdk;步骤s64:sdk对接收到的载入请求响应进行解析得到第一随机数,根据第一随机数和设备标识组装签名请求,将签名请求发送给se;步骤s65:se对接收到的签名请求进行解析得到第一随机数和设备标识,使用设备私钥对第一随机数和设备标识进行签名得到第二签名结果,将第二签名结果发送给sdk;步骤s66:sdk根据接收到的第二签名结果、第一随机数和设备标识生成身份验证请求,将身份验证请求发送给认证中心;相应的,步骤s6与步骤s7之间还包括:步骤c1:认证中心对接收到的身份验证请求进行解析得到第二签名结果、第一随机数和设备标识,根据设备标识获取本地保存的对应的第一随机数;步骤c2:认证中心判断获取到的第一随机数与解析得到的第一随机数是否一致,是则执行步骤c3,否则给sdk返回错误信息,结束;步骤c3:认证中心根据设备标识获取对应的协议数据,使用协议数据中的设备公钥对第二签名结果进行验证,如验证成功则执行步骤c4,如验证失败则给sdk返回错误信息,结束;步骤c4:认证中心根据协议数据中的推送服务地址和签名数据生成重定向信息,将重定向信息返回给sdk;步骤s7:sdk接收到认证中心返回的重定向信息并保存,将sdk的非空闲状态设置为转让前,执行步骤s8;步骤s8:sdk根据设备标识、se生成的第二随机数生成设备连接请求,根据保存的重定向信息中的推送服务地址将设备连接请求发送给对应的推送服务;具体的,在本实施例中,步骤s8包括:步骤s81:sdk生成随机数产生请求并发送给se;步骤s82:se接收到随机数产生请求后生成第二随机数,将第二随机数返回给sdk;步骤s83:sdk保存接收到的第二随机数,生成密码交换算法参数获取请求并发送给se;步骤s84:se接收到密码交换算法参数获取请求后获取ecdh密码协议和密码套件,将ecdh密码协议和密码套件返回给sdk;步骤s85:sdk根据接收到的ecdh密码协议和密码套件、保存的第二随机数、设备标识生成设备连接请求,根据保存的重定向信息中的推送服务地址将设备连接请求发送给对应的推送服务;步骤s9:sdk对接收到的推送服务返回的设备连接响应中的数据进行验证,如验证成功则通过se中的设备私钥对设备标识和密钥交换参数进行签名得到第三签名结果,保存设备连接响应中的第三随机数,根据设备标识、密钥交换参数、第三签名结果和第三随机数生成设备证明请求并发送给推送服务,如验证失败则报错,结束;在本实施例中,推送服务接收到设备连接请求后执行以下操作,即步骤s8与步骤s9之间还包括:推送服务对接收到的设备连接请求进行解析得到ecdh密码协议、密码套件、第二随机数和设备标识,根据设备标识查找保存的设备归属信息,根据ecdh密码协议和密
码套件生成第一参数,对设备连接请求进行哈希计算得到设备连接请求哈希值,根据设备归属信息的头部、设备归属信息中的hamc、第二随机数、第一参数、设备连接请求哈希值生成第一待签名数据,使用推送服务私钥对第一待签名数据进行签名得到第一签名值,根据第一待签名数据、第一签名值、推送服务公钥和生成的第三随机数生成设备连接响应并返回给sdk,保存第三随机数;具体的,在本实施例中,步骤s9包括:步骤s9-1:sdk对接收到的设备连接响应进行解析得到第一待签名数据、第一签名值、推送服务公钥和第三随机数,保存第三随机数,对第一待签名数据进行解析得到设备归属信息的头部、设备归属信息中的hamc、第二随机数、第一参数、设备连接请求哈希值,生成hmac读取请求并发送给se;步骤s9-2:se接收到hmac读取请求后读取保存的设备归属信息的头部hmac值,将设备归属信息的头部hmac值返回给sdk;步骤s9-3:sdk判断接收到的设备归属信息的头部hmac值与解析得到的设备归属信息中的hmac是否一致,是则执行步骤s9-4,否则报错,结束;步骤s9-4:sdk根据保存的重定向信息和推送服务公钥生成载入期间的重定向信息验证请求并发送给se;步骤s9-5:se对接收到的载入期间的重定向信息验证请求进行解析得到重定向信息和推送服务公钥,使用推送服务公钥对重定向信息中的签名数据进行验签,并将验签结果返回给sdk;步骤s9-6:sdk判断接收到的验签结果是否为成功,是则执行步骤s9-7,否则报错,结束;步骤s9-7:sdk根据第一待签名数据、第一签名值和推送服务公钥生成验签请求并发送给se;步骤s9-8:se对接收到验签请求进行解析得到第一待签名数据、第一签名值和推送服务公钥,使用第一待签名数据和推送服务公钥对第一签名值进行验签,并将验签结果返回给sdk;步骤s9-9:sdk判断接收到的验签结果是否为成功,是则执行步骤s9-10,否则报错,结束;步骤s9-10:sdk将设备标识和第一参数发送给se;步骤s9-11:se对接收到的第一参数进行计算得到密钥交换参数并缓存,使用设备私钥对设备标识和密钥交换参数进行签名得到第三签名结果,将第三签名结果和密钥交换参数返回给sdk;步骤s9-12:sdk根据接收到的第三签名结果和密钥交换参数、设备标识、第三随机数生成设备证明请求,将设备证明请求发送给推送服务;步骤s10:当sdk接收到推送服务返回的设备归属信息重置请求时根据密钥交换参数生成第二密钥,使用第二密钥对设备归属信息重置请求进行解密并验证解密结果,如验证成功则判断解密结果中的第三随机数和保存的第三随机数是否一致,是则对设备归属信息重置请求中的设备归属信息进行hmac计算得到第二hmac值,对设备归属信息重置请求中的推送服务公钥计算哈希值,并将推送服务公钥哈希值和第二hmac值缓存在se中,否则报
错,结束,如验证失败则报错,结束;可选的,在本实施例中,步骤s10还包括:sdk将生成的第二密钥保存在共享存储区中;在本实施例中,推送服务接收到设备证明请求执行以下操作,即步骤s9与步骤s10之间还包括:步骤d1:推送服务对接收到的设备证明请求进行解析得到第三签名结果、密钥交换参数、设备标识和第三随机数,根据设备标识从对应的设备归属信息中获取设备公钥,使用设备公钥对第三签名结果进行验证,如验证成功则执行步骤d2,如验证失败则给sdk返回错误信息,结束;步骤d2:推送服务判断解析得到的第三随机数与保存的第三随机数是否一致,是则执行步骤d3,否则给sdk返回错误信息,结束;步骤d3:推送服务根据密钥交换参数生成第一密钥,根据推送服务公钥、设备归属信息、设备标识和第三随机数生成第二待签名数据,使用推送服务私钥对第二待签名数据进行签名得到第二签名值,使用第一密钥对第二待签名数据进行加密得到第一加密结果,根据第一加密结果和第二签名值生成设备归属信息重置请求,将设备归属信息重置请求发送给sdk;具体的,在本实施例中,步骤s10包括:步骤s10-1:sdk对接收到的推送服务返回的设备归属信息重置请求进行解析得到第一加密结果和第二签名值,根据第一加密结果和第二签名值生成第一解密验签请求,将第一解密验签请求发送给se;步骤s10-2:se对接收到的第一解密验签请求进行解析得到第一加密结果和第二签名值,根据缓存的密钥交换参数生成第二密钥,使用第二密钥对第一加密结果进行解密,解密成功得到第二待签名数据;步骤s10-3:se从第二待签名数据中获取推送服务公钥和第三随机数,使用推送服务公钥对第二签名值进行验证,如验证成功则将第二待签名数据返回给sdk,执行步骤s10-4,如验证失败则给sdk返回错误信息,结束;步骤s10-4:sdk接收第二待签名数据,判断获取的第三随机数与保存的第三随机数是否一致,是则执行步骤s10-5,否则给sdk返回错误信息,结束;步骤s10-5:sdk从第二待签名数据中获取推送服务公钥,根据保存的设备归属信息和推送服务公钥生成hmac计算请求,将hmac计算请求发送给se;步骤s10-6:se对接收到的hmac计算请求进行解析得到设备归属信息和推送服务公钥,使用推送服务公钥对设备归属信息进行hmac计算得到第二hmac值,将第二hmac值返回给sdk;步骤s10-7:sdk接收到第二hmac值后,对推送服务公钥进行哈希计算得到推送服务公钥哈希值,将第二hmac值和推送服务公钥哈希值发送给se;步骤s10-8:se接收第二hmac值和推送服务公钥哈希值并保存,给sdk返回存储成功响应;步骤s11:sdk将设备状态变化通知发送给推送服务,当接收到推送服务返回的确认响应时用第二hmac值替换所述se中保存的设备归属信息的头部hmac值,给上层应用返回
运行请求响应,将sdk状态设置为空闲并返回给上层应用,执行步骤s12;具体的,在本实施例中,步骤s11包括:sdk根据设备所能接收的最大消息字节数生成设备状态变化通知,将设备状态变化通知发送给推送服务,接收推送服务返回的服务接收数据的最大长度,给推送服务发送确认请求并当接收到推送服务返回的确认响应时将sdk状态设置为空闲,给上层应用返回运行请求响应,执行步骤s12;更进一步地,步骤s11具体包括:步骤s11-1:sdk接收到存储成功响应后,根据第二hmac值和设备所能接收的最大消息字节数生成第一加密签名请求,将第一加密签名请求发送给se;步骤s11-2:se对接收到的第一加密签名请求进行解析得到第二hmac值和设备所能接收的最大消息字节数,使用设备私钥对第二hmac值和设备所能接收的最大消息字节数进行签名得到第四签名结果,使用第二密钥对第二hmac值和设备所能接收的最大消息字节数进行加密得到第二加密结果,将第二加密结果和第四签名结果返回给sdk;步骤s11-3:sdk根据接收到的第二加密结果和第四签名结果生成设备状态变化通知,将设备状态变化通知发送给推送服务;步骤s11-4:推送服务对接收到的设备状态变化通知进行解析得到第二加密结果和第四签名结果,使用第一密钥对第二加密结果进行解密,解密成功得到第二hmac值和设备所能接收的最大消息字节数,使用保存的设备公钥对第四签名结果进行验证,如验证成功则执行步骤s11-5,如验证失败则给sdk返回错误信息,结束;步骤s11-5:推送服务根据设备所能接收的最大消息字节数生成服务接收数据的最大长度,使用推送服务私钥对服务接收数据的最大长度进行签名得到第五签名结果,使用第一密钥对服务接收数据的最大长度进行加密得到第三密文,根据第五签名结果和第三密文生成服务接收数据上限通知,将服务接收数据上限通知发送给sdk;步骤s11-6:sdk对接收到的服务接收数据上限通知进行解析得到第三密文和第五签名结果,根据第五签名结果和第三密文生成第二解密验签请求,将第二解密验签请求发送给se;步骤s11-7:se对第二解密验签请求进行解析得到第五签名结果和第三密文,使用第二密钥对第三密文进行解密,解密成功得到服务接收数据的最大长度,使用保存的推送服务公钥和服务接收数据的最大长度对第五签名结果进行验证,如验证成功则将服务接收数据的最大长度返回给sdk,执行步骤s11-8,如验证失败则给sdk返回错误信息,结束;步骤s11-8:sdk接收服务接收数据的最大长度并保存,根据保存的第三随机数生成第三加密签名请求,将第三加密签名请求发送给se;步骤s11-9:se对接收到的第三加密签名请求进行解析得到第三随机数,使用第二密钥对第三随机数进行加密得到第四密文,使用设备私钥对第三随机数进行签名得到第六签名结果,将第四密文和第六签名结果发送给sdk;步骤s11-10:sdk根据接收到的第四密文和第六签名结果生成确认请求,将确认请求发送给推送服务;步骤s11-11:推送服务对接收到的确认请求进行解析得到第四密文和第六签名结果,使用第一密钥对第四密文进行解密,解密成功得到第三随机数,使用设备公钥和第三随机数对第六签名结果进行验证,如验证成功则执行步骤s11-12,如验证失败则给sdk返回错
误信息,结束;步骤s11-12:推送服务使用推送服务私钥对第三随机数进行签名得到第七签名结果,使用第一密钥对第三随机数进行加密得到第五密文,根据第五密文和第七签名结果得到确认响应,将确认响应返回给sdk;步骤s11-13:sdk对接收到的确认响应进行解析得到第五密文和第七签名结果,根据第五密文和第七签名结果生成第四解密验签请求,将第四解密验签请求发送给se;步骤s11-14:se对接收到的第四解密验签请求进行解析得到第五密文和第七签名结果,使用第二密钥对第五密文进行解密,解密成功得到第三随机数,使用第三随机数和推送服务公钥对第七签名结果进行验证,如验证成功则用第二hmac值替换保存的设备归属信息的头部hmac,将第三随机数返回给sdk,执行步骤s11-15,如验证失败则给sdk返回错误信息,结束;步骤s11-15:sdk接收到第三随机数后将sdk状态设置为空闲,执行步骤s12;步骤s12:当上层应用接收到sdk返回的空闲状态时,上层应用根据设备标识和第二密钥生成长连接请求并发送给推送服务,当接收到推送服务返回的连接成功响应时与推送服务建立长连接;具体的,在本实施例中,步骤s12包括:步骤s12-1:上层应用根据设备标识生成用户名,使用第二密钥加密用户名生成密码,根据用户名和密码生成长连接请求,根据sdk保存的重定向信息中的推送服务地址将长连接请求发送给对应的推送服务;步骤s12-2:推送服务对接收到的长连接请求进行解析得到用户名和密码,根据用户名和密码验证用户身份,如验证合法则执行步骤s12-3,如不合法则给上层应用返回错误信息,结束;更进一步地,步骤s12-2包括:步骤q1:推送服务解析长连接请求得到用户名和密码,根据保存的设备标识生成新的用户名,判断解析得到的用户名与新的用户名是否一致,是则执行步骤q2,否则验证失败,给上层应用返回错误信息,结束;步骤q2:推送服务根据匹配的新的用户名对应的设备标识获取对应的第一密钥,使用第一密钥对解析得到的用户名进行加密,判断加密结果与解析得到的密码是否一致,是则执行步骤s12-3,如不合法则给上层应用返回错误信息,结束;步骤s12-3:推送服务与上层应用建立长连接,给上层应用返回连接成功响应;步骤s12-4:上层应用接收到连接成功响应后与推送服务开始进行业务通讯。
17.本实施例的方法将终端设备的注册、连接与业务处理进行区分,安全方便。本技术方案中的注册过程(即制造前状态)没有推送服务的参与,连接准备过程(载入前状态和转让前状态)和长连接过程(空闲状态)没有认证中心的参与,使得攻击者在注册过程中没有办法获取终端设备想要连接的推送服务的信息且在连接准备过程和长连接过程无法获取认证中心的信息,保证了推送服务和认证中心的安全性,可避免物联网终端设备、推送服务和认证中心遭受攻击,提高物联网终端设备注册和连接的安全性。
实施例二
18.本发明实施例二提供一种物联网终端设备的注册和连接实现方法,适用于包含sdk、se、上层应用的终端设备,终端设备上电之后,如图2至图6所示,本实施例方法包括:步骤201:上层应用组装sdk初始化指令,并将sdk初始化指令发送给sdk;在本实施例中,步骤201之前,上层应用在制造站被烧录到终端设备中并验证成功;终端设备开机后启动上层应用,上层应用被启动后执行步骤201;可选的,在本实施例中,步骤201之前还包括:认证中心内保存有推送服务信息、推送服务所管理设备的设备信息和设备归属信息;推送服务信息包括推送服务公钥;制造站内保存有订单信息;推送服务内保存有其管理设备的设备信息和设备归属信息,设备归属信息包括设备公钥;步骤202:sdk接收到sdk初始化指令后进行初始化,组装se初始化请求,将se初始化请求发送给se;步骤203:se接收到se初始化请求后进行初始化,给sdk返回se初始化响应;步骤204:sdk接收se初始化响应,组装获取se状态请求,将获取se状态请求发送给se;步骤205:se接收到获取se状态请求后组装se状态响应,给sdk返回se状态响应;步骤206:sdk根据接收到的se状态响应中的状态码判断是否需要对se执行复位操作,是则调用se复位接口,进行se复位操作,否则组装sdk初始化响应,并将sdk初始化响应返回给上层应用;步骤207:上层应用接收到sdk初始化响应后,组装获取sdk状态请求,将获取sdk状态请求发送给sdk;可选的,在本实施例中,如207中上层应用接收到的sdk初始化响应包括失败信息则判断初始化请求发送次数是否小于预设值,是则更新初始化请求发送次数,重新发送sdk初始化指令给sdk,返回202,否则报错;步骤208:sdk接收到获取sdk状态请求后,根据sdk的状态组装sdk状态响应,给上层应用返回sdk状态响应;可选的,本实施例中的sdk的状态包括:空闲状态或非空闲状态或错误状态;sdk的状态的初始值为非空闲状态的制造前;步骤209:上层应用接收sdk状态响应并解析,判断解析得到的sdk的状态的类型,如为非空闲给sdk发送运行请求,执行步骤210,如为空闲则执行步骤282,如为错误则报错,结束;可选的,在本实施例中,如209中上层应用接收到的sdk的状态为错误状态则判断获取状态请求发送次数是否小于预设值,是则更新获取状态请求发送次数,重新发送获取sdk状态请求给sdk,返回208,否则报错,结束;步骤210:sdk接收到运行请求后判断sdk的非空闲状态的类型,如为制造前则执行步骤211,如为载入前则执行步骤226,如为转让前则执行步骤237;步骤211:sdk判断是否保存有设备公钥,是则执行步骤214,否则组装生成密钥请
求,将生成密钥请求发送给se,执行步骤212;步骤212:se接收到生成密钥请求后根据预设算法生成设备密钥对,将设备密钥对中的设备公钥返回给sdk;可选的,在步骤212中,se根据预设算法生成设备密钥对,设备密钥对包括设备私钥和设备公钥;预设算法可以为ecc(中文:椭圆曲线加密法)算法、rsa算法等;步骤213:sdk接收设备公钥并保存;步骤214:sdk根据设备标识、公钥类型、公钥编码、证书申请信息组装设备初始化签名请求,将设备初始化签名请求发送给se;例如,该步骤中的设备初始化签名请求为:{"manufacturinginfo":{
ꢀꢀꢀꢀ
"certinfo": {
ꢀꢀꢀꢀꢀꢀꢀꢀ
"object":""
ꢀꢀꢀꢀ
},
ꢀꢀꢀꢀ
"deviceinfo": "demodevice",
ꢀꢀꢀꢀ
"keyenc": "x509",
ꢀꢀꢀꢀ
"keytype": "secp256r1",
ꢀꢀꢀꢀ
"guid": "102391944303101521000001"
ꢀꢀꢀ
}};步骤215:se使用设备私钥对接收到的设备初始化签名请求进行签名得到第一签名结果,将第一签名结果返回给sdk;步骤216:sdk根据接收到的第一签名结果、设备初始化签名请求和设备公钥组装设备初始化启动请求,根据预置的制造站地址将设备初始化启动请求发送给制造站;优选的,在本实施例中,将设备初始化启动请求发送给制造站包括:sdk对设备初始化启动请求进行cbor编码,根据预置的制造站地址将设备初始化启动请求编码结果发送给制造站;步骤217:制造站对接收到设备初始化启动请求进行解析得到第一签名结果、设备初始化签名请求和设备公钥,使用设备公钥和设备初始化签名请求对解析得到的第一签名结果进行验签,如验证成功则对设备初始化签名请求进行解析得到设备标识、公钥类型、公钥编码、证书申请信息,根据设备标识判断是否保存有对应的设备证书,是则报错,结束,否则根据设备公钥、公钥类型、公钥编码、证书申请信息和设备标识生成设备证书并与设备标识对应保存,执行步骤218,如验证失败则报错,结束;相应的,在步骤217之前制造站对接收到的设备初始化启动请求编码结果进行解码得到设备初始化启动请求;具体的,使用设备公钥和设备初始化签名请求对解析得到的第一签名结果进行验签,包括:使用设备私钥对第一签名结果进行解密,对设备初始化签名请求进行哈希计算,判断解密结果和哈希计算结果是否匹配,是则验证成功,否则验证失败;步骤218:制造站根据制造站公钥、设备证书、认证中心地址、协议版本号生成设备
归属信息的头部,将设备归属信息的头部发送给sdk;优选的,在本实施例中,将设备归属信息的头部发送给sdk包括:制造站对设备归属信息的头部进行cbor编码,将头部编码结果发送给sdk;例如,该步骤中生成的设备归属信息的头部为:{"voucherheader": { "certhash": { "hashtype": "sha256", "hashvalue": "/cgpu8g6vnx3sheh41hpstslgccuqety/7b8cmpeo8w=" }, "deviceinfo": "demodevice", "guid":"102391944303101521000001", "publickey": {
ꢀꢀ
"body": {
ꢀꢀꢀ
"object": ""
ꢀꢀ
},
ꢀꢀ
"enc": "x509",
ꢀꢀ
"type": "secp256r1" }, "rendezvousinfo": [{
ꢀꢀ
"value": "ateyny4wljaumq==",
ꢀꢀ
"variable": "dns" }, {
ꢀꢀ
"value": "80",
ꢀꢀ
"variable": "dev_port" }, {
ꢀꢀ
"value": "192.168.0.2",
ꢀꢀ
"variable": "ip_address" }, {
ꢀꢀ
"value": "80",
ꢀꢀ
"variable": "owner_port" } {
ꢀꢀ
"value": "https",
ꢀꢀ
"variable": "protocol" }] "version": "v101"}}步骤219:sdk对接收到的设备归属信息的头部进行解析得到制造站公钥、认证中
心地址和设备证书并保存,根据设备归属信息的头部生成第一hmac(中文全称:哈希运算消息认证码,英文全称:hash-based message authentication code)计算请求,将第一hmac计算请求发送给se;相应的,在步骤219之前sdk对接收到的头部编码结果进行解码得到设备归属信息的头部;步骤220:se对接收到的hmac计算请求进行解析,对解析得到的设备归属信息的头部进行hmac计算,将计算得到的设备归属信息的头部hmac值返回给sdk;步骤221:sdk将设备归属信息的头部和接收到的设备归属信息的头部hmac值发送给制造站;优选的,在本实施例中,步骤221包括:制造站对设备归属信息的头部和设备归属信息的头部hmac值进行cbor编码,将编码结果发送给sdk;例如,该步骤中的设备归属信息的头部hmac值为:{"hmac": { "hashtype": "hmac_sha256", "hashvalue": "juczi1qtalkrvi3jtphfc/pqq2v3hf+ufzdqmm/v0vs="}}步骤222:制造站对保存的推送服务公钥进行哈希计算得到推送服务公钥哈希值,根据收到的设备归属信息的头部、设备归属信息的头部hmac值和推送服务公钥哈希值组装设备归属信息并与设备标识对应保存,组装成功响应并发送给sdk;相应的,在步骤222之前制造站对接收到的编码结果进行解码得到设备归属信息的头部和设备归属信息的头部hmac值;优选的,在本实施例中,该步骤的成功响应为空,将成功响应发送给sdk包括:制造站对成功响应进行编码并将成功响应编码结果发送给sdk;在本实施例中,设备归属信息包括:协议版本、设备归属信息的头部、设备归属信息的头部hmac值、设备证书链以及条目信息;例如该步骤中组装得到的设备归属信息为:"voucher": {
ꢀꢀ
"certchain": {
ꢀꢀꢀ
"chain": [{
ꢀꢀꢀꢀ
"basicconstraints":
ꢀ‑
1,"elements": ["x509.info", "x509.algorithm", "x509.signature", "x509.signed_cert"],"encoded": "miibhtcbxkadagecaggy/gmfilff0dakbggqhkjopqqdajaumriweaydvqqddalgzg9fbnrpdhkwibcnmjiwnzi4mdezndmxwhgpmja1mjaymjewmtm0mzfambqxejaqbgnvbammcuzkb0vudgl0etbzmbmgbyqgsm49agegccqgsm49aweha0iabea71ejdobfuxsqmubi0tiz+jts9ysi5bqi87gohx+hhuzdrycke7yzr9bzuzcldx2fab7vdjajlunbbhudrhiowcgyikozizj0eawidsaawrqihal4edfufv1jmonzbqpz4lzs8quktlg82dqjstjl0le2maibb+
fqd7vv3qqi7vbz3ioa8hz/m3jyuy6p3s7xkhhnkta==",
ꢀꢀꢀꢀ
"encodedinternal": "miibhtcbxkadagecaggy/gmfilff0dakbggqhkjopqqdajaumriweaydvqqddalgzg9fbnrpdhkwibcnmjiwnzi4mdezndmxwhgpmja1mjaymjewmtm0mzfambqxejaqbgnvbammcuzkb0vudgl0etbzmbmgbyqgsm49agegccqgsm49aweha0iabea71ejdobfuxsqmubi0tiz+jts9ysi5bqi87gohx+hhuzdrycke7yzr9bzuzcldx2fab7vdjajlunbbhudrhiowcgyikozizj0eawidsaawrqihal4edfufv1jmonzbqpz4lzs8quktlg82dqjstjl0le2maibb+fqd7vv3qqi7vbz3ioa8hz/m3jyuy6p3s7xkhhnkta==",
ꢀꢀꢀꢀ
"issuerdn": {
ꢀꢀꢀꢀꢀ
"commonname": "fdoentity",
ꢀꢀꢀꢀꢀ
"empty": false,
ꢀꢀꢀꢀꢀ
"encoded": "mbqxejaqbgnvbammcuzkb0vudgl0eq==",
ꢀꢀꢀꢀꢀ
"encodedinternal": "mbqxejaqbgnvbammcuzkb0vudgl0eq==",
ꢀꢀꢀꢀꢀ
"name": "cn=fdoentity",
ꢀꢀꢀꢀꢀ
"rfc1779name": "cn=fdoentity",
ꢀꢀꢀꢀꢀ
"rfc2253canonicalname": "cn=fdoentity",
ꢀꢀꢀꢀꢀ
"rfc2253name": "cn=fdoentity",
ꢀꢀꢀꢀꢀ
"type": 4
ꢀꢀꢀꢀ
},
ꢀꢀꢀꢀ
"name": "x509",
ꢀꢀꢀꢀ
"notafter": 2592092071000,
ꢀꢀꢀꢀ
"notbefore": 1658972071000,
ꢀꢀꢀꢀ
"publickey": {
ꢀꢀꢀꢀꢀ
"algorithm": "ec",
ꢀꢀꢀꢀꢀ
"algorithmid": {
ꢀꢀꢀꢀꢀ
"encodedparams": "bggqhkjopqmbbw==",
ꢀꢀꢀꢀꢀꢀ
"name": "ec",
ꢀꢀꢀꢀꢀꢀ
"oid": {},
ꢀꢀꢀꢀꢀꢀ
"parameters": {
ꢀꢀꢀꢀꢀꢀꢀ
"algorithm": "1.2.840.10045.2.1",
ꢀꢀꢀꢀꢀꢀꢀ
"encoded": "bggqhkjopqmbbw==",
ꢀꢀꢀꢀꢀꢀꢀ
"provider": {"alg.alias.algorithmparameters.ellipticcurve": "ec","keyagreement.x448": "sun.security.ec.xdhkeyagreement.x448","signature.sha1withecdsa implementedin": "software","signature.sha512withecdsa implementedin": "software","signature.sha512withecdsa supportedkeyclasses": "java.security.interfaces.ecpublickey|java.security.interfaces.ecprivatekey","keypairgenerator.x448 implementedin": "software","alg.alias.keypairgenerator.oid.1.3.101.111": "x448",
"keyfactory.x448": "sun.security.ec.xdhkeyfactory.x448","alg.alias.keypairgenerator.oid.1.3.101.110": "x25519","keyagreement.ecdh keysize": "256","signature.sha384withecdsa implementedin": "software","algorithmparameters.ec keysize": "256","alg.alias.keypairgenerator.ellipticcurve": "ec","signature.sha224withecdsa keysize": "256","keyagreement.ecdh implementedin": "software","keyfactory.ec keysize": "256","alg.alias.keyfactory.1.3.101.111": "x448","alg.alias.keyfactory.1.3.101.110": "x25519","signature.sha256withecdsa": "sun.security.ec.ecdsasignature$sha256","keyagreement.ecdh supportedkeyclasses": "java.security.interfaces.ecpublickey|java.security.interfaces.ecprivatekey","alg.alias.keyfactory.oid.1.3.101.111": "x448","alg.alias.keyfactory.oid.1.3.101.110": "x25519","keyfactory.ec supportedkeyclasses": "java.security.interfaces.ecpublickey|java.security.interfaces.ecprivatekey","keyfactory.xdh implementedin": "software","alg.alias.signature.1.2.840.10045.4.3.4": "sha512withecdsa","signature.sha512withecdsainp1363format": "sun.security.ec.ecdsasignature$sha512inp1363format","signature.nonewithecdsa supportedkeyclasses": "java.security.interfaces.ecpublickey|java.security.interfaces.ecprivatekey","keyfactory.ec": "sun.security.ec.eckeyfactory","alg.alias.signature.1.2.840.10045.4.3.2": "sha256withecdsa","alg.alias.signature.1.2.840.10045.4.3.3": "sha384withecdsa","keyagreement.x25519 implementedin": "software","provider.id version": "11","alg.alias.keyagreement.oid.1.3.101.110": "x25519","keypairgenerator.xdh": "sun.security.ec.xdhkeypairgenerator","provider.id info": "sun elliptic curve provider (ec, ecdsa, ecdh)","alg.alias.keyagreement.oid.1.3.101.111": "x448","keypairgenerator.xdh implementedin": "software","alg.alias.signature.oid.1.2.840.10045.4.1": "sha1withecdsa","signature.sha384withecdsainp1363format": "sun.security.ec.ecdsasignature$sha384inp1363format","alg.alias.signature.1.2.840.10045.4.3.1": "sha224withecdsa","provider.id classname": "sun.security.ec.sunec",
"signature.sha224withecdsa supportedkeyclasses": "java.security.interfaces.ecpublickey|java.security.interfaces.ecprivatekey","alg.alias.algorithmparameters.1.2.840.10045.2.1": "ec","keypairgenerator.x25519": "sun.security.ec.xdhkeypairgenerator.x25519","signature.sha256withecdsa implementedin": "software","signature.sha1withecdsa supportedkeyclasses": "java.security.interfaces.ecpublickey|java.security.interfaces.ecprivatekey","alg.alias.algorithmparameters.oid.1.2.840.10045.2.1": "ec","signature.sha384withecdsa supportedkeyclasses": "java.security.interfaces.ecpublickey|java.security.interfaces.ecprivatekey","keyagreement.xdh": "sun.security.ec.xdhkeyagreement","provider.id name": "sunec","keypairgenerator.ec": "sun.security.ec.eckeypairgenerator","keypairgenerator.ec implementedin": "software","signature.sha256withecdsa supportedkeyclasses": "java.security.interfaces.ecpublickey|java.security.interfaces.ecprivatekey","signature.sha512withecdsa keysize": "256","alg.alias.keyfactory.ellipticcurve": "ec","signature.sha1withecdsa keysize": "256","signature.nonewithecdsa keysize": "256","signature.sha256withecdsa keysize": "256","keypairgenerator.x448": "sun.security.ec.xdhkeypairgenerator.x448", "signature.sha256withecdsainp1363format": "sun.security.ec.ecdsasignature$sha256inp1363format", "keyfactory.xdh": "sun.security.ec.xdhkeyfactory", "signature.nonewithecdsa implementedin": "software", "signature.sha1withecdsainp1363format": "sun.security.ec.ecdsasignature$sha1inp1363format", "keyagreement.x25519": "sun.security.ec.xdhkeyagreement.x25519", "signature.sha384withecdsa keysize": "256", "signature.sha512withecdsa": "sun.security.ec.ecdsasignature$sha512","signature.sha224withecdsa implementedin": "software", "keyagreement.xdh implementedin": "software", "keypairgenerator.ec keysize": "256", "signature.sha384withecdsa": "sun.security.ec.ecdsasignature$sha384", "algorithmparameters.ec": "sun.security.util.ecparameters",
"keyfactory.x25519 implementedin": "software","signature.nonewithecdsainp1363format": "sun.security.ec.ecdsasignature$rawinp1363format","keypairgenerator.ec supportedkeyclasses": "java.security.interfaces.ecpublickey|java.security.interfaces.ecprivatekey","keyfactory.x448 implementedin": "software","signature.sha224withecdsainp1363format": "sun.security.ec.ecdsasignature$sha224inp1363format","algorithmparameters.ec supportedkeyclasses": "java.security.interfaces.ecpublickey|java.security.interfaces.ecprivatekey","keyfactory.x25519": "sun.security.ec.xdhkeyfactory.x25519","keyagreement.x448 implementedin": "software","signature.nonewithecdsa": "sun.security.ec.ecdsasignature$raw","algorithmparameters.ec implementedin": "software","algorithmparameters.ec supportedcurves": "[secp112r1,1.3.132.0.6]|[secp112r2,1.3.132.0.7]|[secp128r1,1.3.132.0.28]|[secp128r2,1.3.132.0.29]|[secp160k1,1.3.132.0.9]|[secp160r1,1.3.132.0.8]|[secp160r2,1.3.132.0.30]|[secp192k1,1.3.132.0.31]|[secp192r1,nist p-192,x9.62 prime192v1,1.2.840.10045.3.1.1]|[secp224k1,1.3.132.0.32]|[secp224r1,nist p-224,1.3.132.0.33]|[secp256k1,1.3.132.0.10]|[secp256r1,nist p-256,x9.62 prime256v1,1.2.840.10045.3.1.7]|[secp384r1,nist p-384,1.3.132.0.34]|[secp521r1,nist p-521,1.3.132.0.35]|[x9.62 prime192v2,1.2.840.10045.3.1.2]|[x9.62 prime192v3,1.2.840.10045.3.1.3]|[x9.62 prime239v1,1.2.840.10045.3.1.4]|[x9.62 prime239v2,1.2.840.10045.3.1.5]|[x9.62 prime239v3,1.2.840.10045.3.1.6]|[sect113r1,1.3.132.0.4]|[sect113r2,1.3.132.0.5]|[sect131r1,1.3.132.0.22]|[sect131r2,1.3.132.0.23]|[sect163k1,nist k-163,1.3.132.0.1]|[sect163r1,1.3.132.0.2]|[sect163r2,nist b-163,1.3.132.0.15]|[sect193r1,1.3.132.0.24]|[sect193r2,1.3.132.0.25]|[sect233k1,nist k-233,1.3.132.0.26]|[sect233r1,nist b-233,1.3.132.0.27]|[sect239k1,1.3.132.0.3]|[sect283k1,nist k-283,1.3.132.0.16]|[sect283r1,nist b-283,1.3.132.0.17]|[sect409k1,nist k-409,1.3.132.0.36]|[sect409r1,nist b-409,1.3.132.0.37]|[sect571k1,nist k-571,1.3.132.0.38]|[sect571r1,nist b-571,1.3.132.0.39]|[x9.62 c2tnb191v1,1.2.840.10045.3.0.5]|[x9.62 c2tnb191v2,1.2.840.10045.3.0.6]|[x9.62 c2tnb191v3,1.2.840.10045.3.0.7]|[x9.62 c2tnb239v1,1.2.840.10045.3.0.11]|[x9.62 c2tnb239v2,1.2.840.10045.3.0.12]|[x9.62 c2tnb239v3,1.2.840.10045.3.0.13]|[x9.62 c2tnb359v1,1.2.840.10045.3.0.18]|[x9.62 c2tnb431r1,1.2.840.10045.3.0.20]|[brainpoolp160r1,1.3.36.3.3.2.8.1.1.1]|[brainpoolp192r1,1.3.36.3.3.2.8.1.1.3]|[brainpoolp224r1,1.3.36.3.3.2.8.1.1.5]|[brainpoolp256r1,1.3.36.3.3.2.8.1.1.7]
|[brainpoolp320r1,1.3.36.3.3.2.8.1.1.9]|[brainpoolp384r1,1.3.36.3.3.2.8.1.1.11]|[brainpoolp512r1,1.3.36.3.3.2.8.1.1.13]","alg.alias.signature.oid.1.2.840.10045.4.3.2": "sha256withecdsa","signature.sha1withecdsa": "sun.security.ec.ecdsasignature$sha1","alg.alias.signature.oid.1.2.840.10045.4.3.3": "sha384withecdsa","alg.alias.signature.oid.1.2.840.10045.4.3.4": "sha512withecdsa","signature.sha224withecdsa": "sun.security.ec.ecdsasignature$sha224","alg.alias.keypairgenerator.1.3.101.110": "x25519","alg.alias.keypairgenerator.1.3.101.111": "x448","alg.alias.signature.oid.1.2.840.10045.4.3.1": "sha224withecdsa","keypairgenerator.x25519 implementedin": "software","alg.alias.signature.1.2.840.10045.4.1": "sha1withecdsa","keyagreement.ecdh": "sun.security.ec.ecdhkeyagreement","keyfactory.ec implementedin": "software","alg.alias.keyagreement.1.3.101.111": "x448","alg.alias.keyagreement.1.3.101.110": "x25519" } }
ꢀꢀ
},"encoded": "mfkwewyhkozizj0caqyikozizj0daqcdqgaerrvv6n04ew5djaxrsjrojn6o2z1hijltclzsy4fh4cdtn1fhyr7vjlh0fm5lwt1fyvpvu90loktscfsdqoueig==","encodedinternal": "mfkwewyhkozizj0caqyikozizj0daqcdqgaerrvv6n04ew5djaxrsjrojn6o2z1hijltclzsy4fh4cdtn1fhyr7vjlh0fm5lwt1fyvpvu90loktscfsdqoueig==","encodedpublicvalue": "bea71ejdobfuxsqmubi0tiz+jts9ysi5bqi87gohx+hhuzdrycke7yzr9bzuzcldx2fab7vdjajlunbbhudrhio=",
ꢀꢀꢀꢀꢀ
"format": "x.509",
ꢀꢀꢀꢀꢀ
"params": {
ꢀꢀꢀꢀꢀꢀ
"cofactor": 1,
ꢀꢀꢀꢀꢀꢀ
"curve": {
ꢀꢀꢀꢀꢀꢀꢀ
"a": 1.1579208921035625e+77,
ꢀꢀꢀꢀꢀꢀꢀ
"b": 4.105836372515214e+76,
ꢀꢀꢀꢀꢀꢀꢀ
"field": {
ꢀꢀꢀꢀꢀꢀꢀꢀ
"fieldsize": 256,
ꢀꢀꢀꢀꢀꢀꢀꢀ
"p": 1.1579208921035625e+77
ꢀꢀꢀꢀꢀꢀꢀ
}
ꢀꢀꢀꢀꢀꢀ
},
ꢀꢀꢀꢀꢀꢀ
"encoded": "bggqhkjopqmbbw==",
ꢀꢀꢀꢀꢀꢀ
"generator": {
ꢀꢀꢀꢀꢀꢀꢀ
"affinex": 4.8439561293906455e+76,
ꢀꢀꢀꢀꢀꢀꢀ
"affiney": 3.6134250956749796e+76
ꢀꢀꢀꢀꢀꢀ
},"name": "secp256r1 [nist p-256, x9.62 prime256v1]",
ꢀꢀꢀꢀꢀꢀ
"objectid": "1.2.840.10045.3.1.7",
ꢀꢀꢀꢀꢀꢀ
"order": 1.1579208921035625e+77
ꢀꢀꢀꢀꢀ
}, "w": {
ꢀꢀꢀꢀꢀꢀ
"affinex": 3.199377615191878e+76,
ꢀꢀꢀꢀꢀꢀ
"affiney": 3.7639704698723336e+76
ꢀꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
},
ꢀꢀꢀꢀ
"serialnumber": 3674384926778672600,
ꢀꢀꢀꢀ
"serialnumberobject": {
ꢀꢀꢀꢀꢀ
"number": 3674384926778672600
ꢀꢀꢀꢀ
},
ꢀꢀꢀꢀ
"sigalgname": "sha256withecdsa",
ꢀꢀꢀꢀ
"sigalgoid": "1.2.840.10045.4.3.2",
ꢀꢀꢀꢀ
"signature": "meuciqc+baxvbb9stkdwqukc+c2bpkljls4pnnui7eyzdjrnjaigw/n0a+7790eco1qc94qgvb8/5t48lmuj90u1yhx55lq=",
ꢀꢀꢀꢀ
"subjectdn": {
ꢀꢀꢀꢀꢀ
"commonname": "fdoentity",
ꢀꢀꢀꢀꢀ
"empty": false,
ꢀꢀꢀꢀꢀ
"encoded": "mbqxejaqbgnvbammcuzkb0vudgl0eq==",
ꢀꢀꢀꢀꢀ
"encodedinternal": "mbqxejaqbgnvbammcuzkb0vudgl0eq==",
ꢀꢀꢀꢀꢀ
"name": "cn=fdoentity",
ꢀꢀꢀꢀꢀ
"rfc1779name": "cn=fdoentity",
ꢀꢀꢀꢀꢀ
"rfc2253canonicalname": "cn=fdoentity",
ꢀꢀꢀꢀꢀ
"rfc2253name": "cn=fdoentity",
ꢀꢀꢀꢀꢀ
"type": 4
ꢀꢀꢀꢀ
},
ꢀꢀꢀꢀ
"tbscertificate": "miheoamcaqiccdl+cz+isuxqmaogccqgsm49bamcmbqxejaqbgnvbammcuzkb0vudgl0etagfw0ymja3mjgwmtm0mzfaga8ymduymdiymtaxmzqzmvowfdesmbaga1ueawwjrmrvrw50axr5mfkwewyhkozizj0caqyikozizj0daqcdqgaerrvv6n04ew5djaxrsjrojn6o2z1hijltclzsy4fh4cdtn1fhyr7vjlh0fm5lwt1fyvpvu90loktscfsdqoueig==",
ꢀꢀꢀꢀ
"type": "x.509",
ꢀꢀꢀꢀ
"version": 3
ꢀꢀꢀ
}, {
ꢀꢀꢀꢀ
"basicconstraints":
ꢀ‑
1,
ꢀꢀꢀꢀ
"elements": ["x509.info", "x509.algorithm", "x509.signature", "x509.signed_cert"],
ꢀꢀꢀꢀ
"encoded": "miibhdcbxkadagecaghvz0b8aezkvjakbggqhkjopqqdajaumriweaydvqqddalgzg9fbnrpdhkwibcnmjiwnzi4mdezndmxwhgpmja1mjaymjewmtm0mzfambqxejaqbgnvbammcuzkb0vudgl0etbzmbmgbyqgsm49agegccqgsm49aweha0iaboxdoeieykscey0gmmtft73dzmamgr26eslbo7vcbcghqedmbt6jncfxfdvczt006dhf+ckcl+08qcnpqcz11q8wcgyikozizj0eawidrwawraigs9bt/eyoitxwecbkeonzxk1fmrhqfmuzosk7pw7ungscidanfhtp0fj5x5q1zyh3isvirffq9bvtw8gsuaae4otm",
ꢀꢀꢀꢀ
"encodedinternal": "miibhdcbxkadagecaghvz0b8aezkvjakbggqhkjopqqdajaumriweaydvqqddalgzg9fbnrpdhkwibcnmjiwnzi4mdezndmxwhgpmja1mjaymjewmtm0mzfambqxejaqbgnvbammcuzkb0vudgl0etbzmbmgbyqgsm49agegccqgsm49aweha0iaboxdoeieykscey0gmmtft73dzmamgr26eslbo7vcbcghqedmbt6jncfxfdvczt006dhf+ckcl+08qcnpqcz11q8wcgyikozizj0eawidrwawraigs9bt/eyoitxwecbkeonzxk1fmrhqfmuzosk7pw7ungscidanfhtp0fj5x5q1zyh3isvirffq9bvtw8gsuaae4otm",
ꢀꢀꢀꢀ
"issuerdn": {
ꢀꢀꢀꢀꢀ
"commonname": "fdoentity",
ꢀꢀꢀꢀꢀ
"empty": false,
ꢀꢀꢀꢀꢀ
"encoded": "mbqxejaqbgnvbammcuzkb0vudgl0eq==",
ꢀꢀꢀꢀꢀ
"encodedinternal": "mbqxejaqbgnvbammcuzkb0vudgl0eq==",
ꢀꢀꢀꢀꢀ
"name": "cn=fdoentity",
ꢀꢀꢀꢀꢀ
"rfc1779name": "cn=fdoentity",
ꢀꢀꢀꢀꢀ
"rfc2253canonicalname": "cn=fdoentity",
ꢀꢀꢀꢀꢀ
"rfc2253name": "cn=fdoentity",
ꢀꢀꢀꢀꢀ
"type": 4
ꢀꢀꢀꢀ
},
ꢀꢀꢀꢀ
"name": "x509",
ꢀꢀꢀꢀ
"notafter": 2592092071000,
ꢀꢀꢀꢀ
"notbefore": 1658972071000,
ꢀꢀꢀꢀ
"publickey": {
ꢀꢀꢀꢀꢀ
"algorithm": "ec",
ꢀꢀꢀꢀꢀ
"algorithmid": {
ꢀꢀꢀꢀꢀꢀ
"encodedparams": "bggqhkjopqmbbw==",
ꢀꢀꢀꢀꢀꢀ
"name": "ec",
ꢀꢀꢀꢀꢀꢀ
"oid": {},
ꢀꢀꢀꢀꢀꢀ
"parameters": {
ꢀꢀꢀꢀꢀꢀꢀ
"algorithm": "1.2.840.10045.2.1",
ꢀꢀꢀꢀꢀꢀꢀ
"encoded": "bggqhkjopqmbbw==",
ꢀꢀꢀꢀꢀꢀꢀ
"provider": {
ꢀꢀꢀꢀꢀꢀꢀꢀ
"$ref": "$.to0d.voucher.certchain.chain[0].publickey.algorit
hmid.parameters.provider"
ꢀꢀꢀꢀꢀꢀꢀ
}
ꢀꢀꢀꢀꢀꢀ
}
ꢀꢀꢀꢀꢀ
},
ꢀꢀꢀꢀꢀ
"encoded": "mfkwewyhkozizj0caqyikozizj0daqcdqgae7em4qh7ksxwtlqyyzmvpvd1kxqabhborkvs7tujtwagp4mwg3omcixeunvxm3ttp2ex5wokx7typw2mpzpxvdw==",
ꢀꢀꢀꢀꢀ
"encodedinternal": "mfkwewyhkozizj0caqyikozizj0daqcdqgae7em4qh7ksxwtlqyyzmvpvd1kxqabhborkvs7tujtwagp4mwg3omcixeunvxm3ttp2ex5wokx7typw2mpzpxvdw==",
ꢀꢀꢀꢀꢀ
"encodedpublicvalue": "boxdoeieykscey0gmmtft73dzmamgr26eslbo7vcbcghqedmbt6jncfxfdvczt006dhf+ckcl+08qcnpqcz11q8=",
ꢀꢀꢀꢀꢀ
"format": "x.509",
ꢀꢀꢀꢀꢀ
"params": {
ꢀꢀꢀꢀꢀꢀ
"$ref": "$.to0d.voucher.certchain.chain[0].publickey.params"
ꢀꢀꢀꢀꢀ
},
ꢀꢀꢀꢀꢀ
"w": {
ꢀꢀꢀꢀꢀꢀ
"affinex": 1.068645992993855e+77,
ꢀꢀꢀꢀꢀꢀ
"affiney": 7.683805329453275e+76
ꢀꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
},
ꢀꢀꢀꢀ
"serialnumber": 8027455762135928000,
ꢀꢀꢀꢀ
"serialnumberobject": {
ꢀꢀꢀꢀꢀ
"number": 8027455762135928000
ꢀꢀꢀꢀ
},
ꢀꢀꢀꢀ
"sigalgname": "sha256withecdsa",
ꢀꢀꢀꢀ
"sigalgoid": "1.2.840.10045.4.3.2",
ꢀꢀꢀꢀ
"signature": "meqcievw7f3sjie18hng5bkdc1ytrzkr6hzrszkpo6vu1j4laiawdryuz9hyev+atc2id4klskxrupqvu1vbkrggnuklta==",
ꢀꢀꢀꢀ
"subjectdn": {
ꢀꢀꢀꢀꢀ
"commonname": "fdoentity",
ꢀꢀꢀꢀꢀ
"empty": false,
ꢀꢀꢀꢀꢀ
"encoded": "mbqxejaqbgnvbammcuzkb0vudgl0eq==",
ꢀꢀꢀꢀꢀ
"encodedinternal": "mbqxejaqbgnvbammcuzkb0vudgl0eq==",
ꢀꢀꢀꢀꢀ
"name": "cn=fdoentity",
ꢀꢀꢀꢀꢀ
"rfc1779name": "cn=fdoentity",
ꢀꢀꢀꢀꢀ
"rfc2253canonicalname": "cn=fdoentity",
ꢀꢀꢀꢀꢀ
"rfc2253name": "cn=fdoentity",
ꢀꢀꢀꢀꢀ
"type": 4
ꢀꢀꢀꢀ
},
ꢀꢀꢀꢀ
"tbscertificate": "miheoamcaqiccg9nqhwarkpwmaogccqgsm49bamcmbqxejaqbgnvbammcuzkb0vudgl0etagfw0ymja3mjgwmtm0mzfaga8ymduymdiymtaxmzqzmvowfdesmbaga1ueawwjrmrvrw50axr5mfkwewyhkozizj0caqyikozizj0daqcdqgae7em4qh7ksxwtlqyyzmvpvd1kxqabhborkvs7tujtwagp4mwg3omcixeunvxm3ttp2ex5wokx7typw2mpzpxvdw==",
ꢀꢀꢀꢀ
"type": "x.509",
ꢀꢀꢀꢀ
"version": 3
ꢀꢀꢀ
}],
ꢀꢀꢀ
"path": {
ꢀꢀꢀꢀ
"certificates": [{
ꢀꢀꢀꢀꢀ
"$ref": "$.to0d.voucher.certchain.chain[0]"
ꢀꢀꢀꢀ
}, {
ꢀꢀꢀꢀꢀ
"$ref": "$.to0d.voucher.certchain.chain[1]"
ꢀꢀꢀꢀ
}],
ꢀꢀꢀꢀ
"encoded": "miicqtccarwwgcsgawibagiib2dafabgslywcgyikozizj0eawiwfdesmbaga1ueawwjrmrvrw50axr5mcaxdtiymdcyodaxmzqzmvoydziwntiwmjixmdezndmxwjaumriweaydvqqddalgzg9fbnrpdhkwwtatbgcqhkjopqibbggqhkjopqmbbwncaatsqzhchsplhbmtbjjkxu+93wtgpoeduhepwzu1qm3boangzabeizwhcrq1xgbdnonyrfncgpftpkndaanm9dupmaogccqgsm49bamca0cameqcievw7f3sjie18hng5bkdc1ytrzkr6hzrszkpo6vu1j4laiawdryuz9hyev+atc2id4klskxrupqvu1vbkrggnukltdccar0wgcsgawibagiimv4jn4ixrdawcgyikozizj0eawiwfdesmbaga1ueawwjrmrvrw50axr5mcaxdtiymdcyodaxmzqzmvoydziwntiwmjixmdezndmxwjaumriweaydvqqddalgzg9fbnrpdhkwwtatbgcqhkjopqibbggqhkjopqmbbwncaargu9xo3tgrbl0kdfgyne4mfo7bpweiow0ivoxjh8fhx1m3uwhjhu8mufqwbmxc3v9hwm+73swis1jwwx1a64skmaogccqgsm49bamca0gameuciqc+baxvbb9stkdwqukc+c2bpkljls4pnnui7eyzdjrnjaigw/n0a+7790eco1qc94qgvb8/5t48lmuj90u1yhx55lq=",
ꢀꢀꢀꢀ
"encodings": ["pkipath", "pkcs7"],
ꢀꢀꢀꢀ
"type": "x.509"
ꢀꢀꢀ
}
ꢀꢀ
},
ꢀꢀ
"entries": [{
ꢀꢀꢀ
"payload": "hiivwcbeqxflx292srawwgdqbhzms3kaa7qj6r5oqm5s6ln+uyivwccpyodnv6silmganxhncajmosj+8i1trhw3rarsqqy0tfadcgfywzbzmbmgbyqgsm49agegccqgsm49aweha0iabgndwai+l6zgrxhgqzpnqkexp7r/bx2qwrf+g5tvnhpdlxinadfx7jdsbzczdqnpswfsch0kyrkkpr9sf2wyb7g=",
ꢀꢀꢀ
"protectedheader": "oqem",
ꢀꢀꢀ
"signature": "mhujajou2qzmypizzmawlpy1wd2rfwhn/j2v9rbqr0qnfoqfodb0amlesmypspx4tabfaztojzsn/xlygzxz4q==",
ꢀꢀꢀ
"tag": "cose_sign_1",
ꢀꢀꢀ
"unprotectedheader": {}
ꢀꢀ
}],
ꢀꢀ
"header": "hhhlueujzgc4l0jesfugwlidry2bhyifsmkxmjcumc4wljgca0mzh5ccdeebggjfrh8aaagcbemzh5bqrgvtb0rldmljzymkavhbmfkwewyhkozizj0caqyikozizj0daqcdqgae7em4qh7ksxwtlqyyzmvpvd1kxqabhborkvs7tujtwagp4mwg3omcixeunvxm3ttp2ex5wokx7typw2mpzpxvd4ivwcd9ya9tydpu3hdkf4fjuc9jnkwbxy6os3l/shxyal47za==",
ꢀꢀ
"hmac": {
ꢀꢀꢀ
"hashtype": "hmac_sha256",
ꢀꢀꢀ
"hashvalue": "juczi1qtalkrvi3jtphfc/pqq2v3hf+ufzdqmm/v0vs="
ꢀꢀ
},
ꢀꢀ
"version": "v101" }, "waitseconds": 86400};步骤223:sdk接收到成功响应后对制造站公钥计算哈希得到制造站公钥哈希值,将设备归属信息的头部hmac值和制造站公钥哈希值发送给se;相应的,在步骤223之前还包括:sdk对接收到的成功响应编码结果进行解码得到成功响应报文;步骤224:se保存接收到的设备归属信息的头部hmac值和制造站公钥哈希值,给sdk返回存储成功响应;步骤225:sdk接收到存储成功响应后将sdk的非空闲状态设置为载入前,给上层应用返回运行请求响应,执行步骤226;步骤226:sdk根据设备标识生成载入请求,并将载入请求发送给认证中心;优选的,在本实施例中,将载入请求发送给认证中心包括:sdk对载入请求进行编码,并将载入请求编码结果发送给认证中心;例如,该步骤中的载入请求为:{"guid": "102391944303101521000001"};步骤227:认证中心对接收到的载入请求进行解析,根据解析得到的设备标识判断是否保存有对应的协议数据,是则执行步骤228,否则给sdk返回错误信息,结束;相应的,在步骤227之前还包括:认证中心对接收到的载入请求编码结果进行解码得到载入请求;在本实施例中,协议数据包括第一协议数据和第二协议数据,第一协议数据中包括设备公钥,第二协议数据中包括推送服务地址和签名数据;步骤228:认证中心生成第一随机数并与设备标识对应保存,根据第一随机数生成载入请求响应,将载入请求响应返回给sdk;优选的,在本实施例中,将载入请求响应返回给sdk包括:认证中心对载入请求响应进行编码并将载入请求响应编码结果发送给sdk;例如,该步骤中的载入请求响应为:{

"nonce": "vunofyx1qbo/6llou0anfq=="};步骤229:sdk对接收到的载入请求响应进行解析得到第一随机数,根据第一随机数和设备标识组装签名请求,将签名请求发送给se;相应的,在步骤229之前还包括:sdk对载入请求响应编码结果进行解码得到载入请求响应;步骤230:se对接收到的签名请求进行解析得到第一随机数和设备标识,使用设备私钥对第一随机数和设备标识进行签名得到第二签名结果,将第二签名结果发送给sdk;步骤231:sdk根据接收到的第二签名结果、第一随机数和设备标识生成身份验证请求,将身份验证请求发送给认证中心;优选的,在本实施例中,将身份验证请求发送给认证中心包括:sdk对身份验证请求进行编码并将身份验证请求编码结果发送给认证中心;例如,该步骤中生成的身份验证请求为:{"payload": { "nonce": "vunofyx1qbo/6llou0anfq==",
ꢀꢀ
"guid": "102391944303101521000001"},
ꢀꢀꢀ
"protectedheader": "",
ꢀꢀꢀ
"signature": "hhhlueujzgc4l0jesfuokx7jnkwbxy6os3l/shxyal47za==",
ꢀꢀꢀ
"tag": "cose_sign_1",
ꢀꢀꢀ
"unprotectedheader": { }};步骤232:认证中心对接收到的身份验证请求进行解析得到第二签名结果、第一随机数和设备标识,根据设备标识获取本地保存的对应的第一随机数;相应的,在步骤232之前还包括:认证中心对接收到的身份验证请求编码结果进行解码得到身份验证请求;步骤233:认证中心判断获取到的第一随机数与解析得到的第一随机数是否一致,是则执行步骤234,否则给sdk返回错误信息,结束;步骤234:认证中心根据设备标识获取对应的协议数据,使用协议数据中的设备公钥对第二签名结果进行验证,如验证成功则执行步骤235,如验证失败则给sdk返回错误信息,结束;本实施例中的协议数据包括第一协议数据和第二协议数据,设备公钥包含在第一协议数据中;具体的,在本实施例中,使用第一协议数据中的设备公钥对第二签名结果进行验证,包括:对第一随机数和设备标识计算哈希得到第一哈希值,使用第一协议数据中的设备公钥对第二签名结果进行解密得到第一解密值,判断第一哈希值与第一解密值是否匹配,是则验证成功,否则验证失败;步骤235:认证中心根据设备标识查找对应的第二协议数据,获取第二协议数据中
的推送服务地址和签名数据,根据推送服务地址和签名数据生成重定向信息,将重定向信息返回给sdk;优选的,在本实施例中,将重定向信息返回给sdk包括:认证中心对重定向信息进行编码并将重定向信息编码结果发送给sdk;第二协议数据中的签名数据为推送服务注册到认证中心的过程中使用推送服务私钥对第二协议数据的头部进行签名得到的;例如,该步骤中的重定向信息为:"payload":{"rendezvousinfo": [{
ꢀꢀ
"value": "ateyny4wljaumq==",
ꢀꢀ
"variable": "dns" }, {
ꢀꢀ
"value": "80",
ꢀꢀ
"variable": "dev_port" }, {
ꢀꢀ
"value": "192.168.1.1",
ꢀꢀ
"variable": "ip_address" }, {
ꢀꢀ
"value": "80",
ꢀꢀ
"variable": "owner_port" } {
ꢀꢀ
"value": "https",
ꢀꢀ
"variable": "protocol" }],"protectedheader": "oqem","signature": "df0o5r3afz3owxxvocbcuiqxq3o0cx7ooqu7gk9vuck0azk90qwlx+w==","tag": "cose_sign_1","unprotectedheader": {}步骤236:sdk接收重定向信息并保存,将sdk的非空闲状态设置为转让前,给上层应用返回运行请求响应,执行步骤237;相应的,在步骤236之前还包括:认证中心对接收到的重定向信息编码结果进行解码得到重定向信息;步骤237:sdk生成随机数产生请求,将随机数产生请求发送给se;步骤238:se接收到随机数产生请求后生成第二随机数,将第二随机数返回给sdk;步骤239:sdk保存接收到的第二随机数,生成密码交换算法参数获取请求,将密码交换算法参数获取请求发送给se;步骤240:se接收到密码交换算法参数获取请求后获取ecdh密码协议和密码套件,将ecdh密码协议和密码套件返回给sdk;
步骤241:sdk根据接收到的ecdh密码协议和密码套件、保存的第二随机数、设备标识生成设备连接请求,根据保存的重定向信息中的推送服务地址将设备连接请求发送给对应的推送服务;优选的,根据保存的重定向信息中的推送服务地址将设备连接请求发送给对应的推送服务包括:sdk对设备连接请求进行cbor编码,并根据保存的重定向信息中的推送服务地址将设备连接请求编码结果发送给对应的推送服务;例如,该步骤中的设备连接请求为:{"ciphersuitetype": "","guid": "102391944303101521000001","kexsuitename": "ecdh256","maxmessagesize": 13000,"nonce": "uwnhsfbosf+n2ivfqavpag=="};步骤242:推送服务对接收到的设备连接请求进行解析得到ecdh密码协议、密码套件、第二随机数和设备标识,根据设备标识查找保存的设备归属信息,根据ecdh密码协议和密码套件生成第一参数,对设备连接请求进行哈希计算得到设备连接请求哈希值,根据设备归属信息的头部、设备归属信息中的hamc、第二随机数、第一参数、设备连接请求哈希值生成第一待签名数据,使用推送服务私钥对第一待签名数据进行签名得到第一签名值,根据第一待签名数据、第一签名值、推送服务公钥和生成的第三随机数生成设备连接响应,将设备连接响应返回给sdk;相应的,在步骤242之前还包括:推送服务对接收到的设备连接请求编码结果进行解码得到设备连接请求;优选的,将设备连接响应返回给sdk包括:推送服务对将设备连接响应进行编码,将设备连接响应编码结果返回给sdk;可选的,在步骤242中还包括:推送服务保存生成的第三随机数;例如,该步骤生成的设备连接响应为:{
ꢀꢀꢀ
"payload": {
ꢀꢀꢀ
"header": {
ꢀꢀꢀꢀꢀꢀꢀꢀ
"certhash": {
ꢀꢀ
"hashtype": "sha256",
ꢀꢀ
"hashvalue": "/cgpu8g6vnx3sheh41hpstslgccuqety/7b8cmpeo8w=" }, "deviceinfo": "demodevice", "guid": "102391944303101521000001", "publickey": {
ꢀꢀ
"body": {
ꢀꢀꢀ
"object": ""
ꢀꢀ
},
ꢀꢀ
"enc": "x509",
ꢀꢀ
"type": "secp256r1" }, "rendezvousinfo": [{
ꢀꢀ
"value": "ateyny4wljaumq==",
ꢀꢀ
"variable": "dns" }, {
ꢀꢀ
"value": "80",
ꢀꢀ
"variable": "dev_port" }, {
ꢀꢀ
"value": "192.168.0.2",
ꢀꢀ
"variable": "ip_address" }, {
ꢀꢀ
"value": "80",
ꢀꢀ
"variable": "owner_port" } {
ꢀꢀ
"value": "https",
ꢀꢀ
"variable": "protocol" }] "version": "v101"}}
ꢀꢀꢀꢀꢀ
"hellodevicehash": {
ꢀꢀꢀꢀꢀꢀꢀꢀꢀ
"hashtype": "sha256",
ꢀꢀꢀꢀꢀꢀꢀꢀꢀ
"hash": "8j/go6zrmtgu97nbvfcjhba/pgfxgbpz9gkknlmnrdk="
ꢀꢀꢀꢀꢀ
},
ꢀꢀꢀꢀꢀ
"hmac": {
ꢀꢀꢀꢀꢀꢀꢀꢀꢀ
"hashtype": "hmac_sha256",
ꢀꢀꢀꢀꢀꢀꢀꢀꢀ
"hash": "hi9le0ekjpizpf05xwr/+hcm1m0akezjworq5ruwvre="
ꢀꢀꢀꢀꢀ
},
ꢀꢀꢀꢀꢀ
"xakeyexchange": "",
ꢀꢀꢀꢀꢀ
"maxownermessagesize": 0,
ꢀꢀꢀꢀꢀ
"nonceto2proveov": "uwnhsfbosf+n2ivfqavpag==",
ꢀꢀꢀꢀꢀ
"numoventries": 1, },
ꢀꢀꢀ
"protectedheader": "oqem",
ꢀꢀꢀ
"signature": "df0o5r3afz3owxxvocbcuiqxq3o0cx7ooqu7gk9vuck0azk90qwlx+w==",
ꢀꢀꢀ
"tag": "cose_sign_1",
ꢀꢀꢀ
"unprotectedheader": {
ꢀꢀꢀꢀꢀꢀꢀ
"cupnonce": {
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
"nonce": "8mhw+9tws7ozbgvvvsqxow=="
ꢀꢀꢀꢀꢀꢀꢀ
},
ꢀꢀꢀꢀꢀꢀꢀ
"ownerpublickey": {
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
"body": {
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
"object": "boxdoeieykscey0gmmtft73dzmamgr26eslbo7vcbcghqedmbt6jncfxfdvczt006dhf+ckcl+08qcnpqcz11q8="
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
},
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
"enc": "x509",
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
"type": "secp256r1"
ꢀꢀꢀꢀꢀꢀꢀ
}
ꢀꢀꢀ
}};步骤243:sdk对接收到的设备连接响应进行解析得到第一待签名数据、第一签名值、推送服务公钥和第三随机数,保存第三随机数,对第一待签名数据进行解析得到设备归属信息的头部、设备归属信息中的hamc、第二随机数、第一参数、设备连接请求哈希值,生成hmac读取请求,将hmac读取请求发送给se;相应的,在步骤243之前还包括:sdk对接收到的设备连接响应编码结果进行解码得到设备连接响应;步骤244:se接收到hmac读取请求后读取保存的设备归属信息的头部hmac值,将设备归属信息的头部hmac值返回给sdk;步骤245:sdk判断接收到的设备归属信息的头部hmac值与解析得到的设备归属信息中的hmac是否一致,是则执行步骤246,否则报错,结束;步骤246:sdk根据保存的重定向信息和推送服务公钥生成载入期间的重定向信息验证请求,将载入期间的重定向信息验证请求发送给se;步骤247:se对接收到载入期间的重定向信息验证请求进行解析得到重定向信息和推送服务公钥,使用推送服务公钥对重定向信息中的签名数据进行验签,将验签结果返回给sdk;步骤248:sdk判断接收到的验签结果是否为成功,是则执行步骤249,否则报错,结束;步骤249:sdk根据第一待签名数据、第一签名值和推送服务公钥生成验签请求,将验签请求发送给se;步骤250:se对接收到验签请求进行解析得到第一待签名数据、第一签名值和推送服务公钥,使用第一待签名数据和推送服务公钥对第一签名值进行验签,将验签结果返回给sdk;具体的,在本实施例中,使用第一待签名数据和推送服务公钥对第一签名值进行验签,包括:对第一待签名数据进行哈希计算,使用推送服务公钥对第一签名值进行解密,判断哈希结算结果与解密结果是否匹配,是则验签结果为成功,否则验签结果为失败;
步骤251:sdk判断接收到的验签结果是否为成功,是则执行步骤252,否则报错,结束;步骤252:sdk将设备标识和第一参数发送给se;步骤253:se对接收到的第一参数进行计算得到密钥交换参数并缓存,使用设备私钥对设备标识和密钥交换参数进行签名得到第三签名结果,将第三签名结果和密钥交换参数返回给sdk;步骤254:sdk根据接收到的第三签名结果和密钥交换参数、设备标识、第三随机数生成设备证明请求,将设备证明请求发送给推送服务;优选的,在本实施例中,将设备证明请求发送给推送服务包括:sdk对设备证明请求进行cbor编码,并将设备证明请求编码结果发送给推送服务;例如,该步骤中生成的设备证明请求为:"payload": {
ꢀꢀꢀꢀꢀ
"xbkeyexchange": 3081d202010030819706092a864886f70d010301308189024100fca682ce8e12caba26efccf7110e526db078b05edecbcd1eb4a208f3ae1617ae01f35b91a47e6df63413c5e12ed0899bcd132acd50d99151bdc43ee737592e170240678471b27a9cf44ee91a49c5147db1a9aaf244f05a434d6486931d2d14271b9e35030b71fd73da179069b32e2935630e1c2062354d0da20a6c416e50be794ca4020201800433023100fafa6943274c4cdc612ca383b6251dbef545023f1919e2d07dbc1466b906e7b0e58934fe57a02bbf34388df009d5ee97","nonceto2provedv": "zan+aqldrjwoan3zpgvtwg==",
ꢀꢀ
"guid": "102391944303101521000001" },
ꢀꢀꢀ
"protectedheader": "oqem","signature": qizt0axf5/l6lbg1xyh+pt/ogcfacbe1qvv+4egmr0qvoko8xoydm6zofa36/yhov0bicuxqpeqouj43j1+qmg==","tag": "cose_sign_1",
ꢀꢀꢀ
"unprotectedheader": {
ꢀꢀꢀꢀꢀꢀꢀ
"euphnonce": {
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
"nonceto2setupdv": "8mhw+9tws7ozbgvvvsqxow=="
ꢀꢀꢀꢀꢀꢀꢀ
},
ꢀꢀꢀ
}};步骤255:推送服务对接收到的设备证明请求进行解析得到第三签名结果、密钥交换参数、设备标识和第三随机数,根据设备标识从对应的设备归属信息中获取设备公钥,使用设备公钥对第三签名结果进行验证,如验证成功则执行步骤256,如验证失败则给sdk返回错误信息,结束;相应的,步骤255之前还包括:推送服务对接收到的设备证明请求编码结果进行解码得到设备证明请求;具体的,使用设备公钥对第一签名结果进行验证包括:使用设备公钥对第三签名
结果进行解密,对设备标识和密钥交换参数进行哈希计算,判断解密结果和哈希计算结果是否匹配,是则验证成功,否则验证失败;步骤256:推送服务判断解析得到的第三随机数与保存的第三随机数是否一致,是则执行步骤257,否则给sdk返回错误信息,结束;步骤257:推送服务根据密钥交换参数生成第一密钥,根据推送服务公钥、设备归属信息、设备标识和第三随机数生成第二待签名数据,使用推送服务私钥对第二待签名数据进行签名得到第二签名值,使用第一密钥对第二待签名数据进行加密得到第一加密结果,根据第一加密结果和第二签名值生成设备归属信息重置请求,将设备归属信息重置请求发送给sdk;优选的,在本实施例中,将设备归属信息重置请求发送给sdk包括:推送服务对设备归属信息重置请求进行cbor编码,并将设备归属信息重置请求编码结果发送给sdk;例如,该步骤中生成的设备归属信息重置请求为:{
ꢀꢀꢀ
"payload": {
ꢀꢀꢀꢀꢀ
"rendezvousinfo": [{
ꢀꢀ
"value": "ateyny4wljaumq==",
ꢀꢀ
"variable": "dns" }, {
ꢀꢀ
"value": "80",
ꢀꢀ
"variable": "dev_port" }, {
ꢀꢀ
"value": "192.168.0.2",
ꢀꢀ
"variable": "ip_address" }, {
ꢀꢀ
"value": "80",
ꢀꢀ
"variable": "owner_port" } {
ꢀꢀ
"value": "https",
ꢀꢀ
"variable": "protocol" }], "nonceto2setupdv": "zan+aqldrjwoan3zpgvtwg==",
ꢀꢀ
"guid": {102391944303101521000001},"owner2key":"mfwwdqyjkozihvcnaqebbqadswawsajbalfdbchzc88atzsenekro//se4wyapppr3f3zbvl5ebrz6sn4/hugpjmma4geugo+c0n9to8vl7t4jbb3u0zleucaweaaq==" },
ꢀꢀꢀ
"protectedheader": "oqem","signature": "miibvqibadanbgkqhkig9w0baqefaascat8wgge7ageaakeasv0eifnzzxpnmx6d
6rgj/9j7jdjo+k+vcxfntwxl5utnpi3j+g6a8myxriarqaj5zsf207y+xtpimehe7rmurqidaqabakadbs541yh3ul9x8og","tag": "cose_sign_1",
ꢀꢀꢀ
"unprotectedheader": {}};步骤258:sdk对接收到的设备归属信息重置请求进行解析得到第一加密结果和第二签名值,根据第一加密结果和第二签名值生成第一解密验签请求,将第一解密验签请求发送给se;对应的,在步骤257之前还包括:sdk对接收到的设备归属信息重置请求编码结果进行解码得到设备归属信息重置请求;步骤259:se对接收到的第一解密验签请求进行解析得到第一加密结果和第二签名值,根据缓存的密钥交换参数生成第二密钥,使用第二密钥对第一加密结果进行解密,解密成功得到第二待签名数据;可选的,在本实施例中,步骤259还包括:se将生成的第二密钥保存在共享存储区中,sdk和上层应用可直接使用该第二密钥;步骤260:se从第二待签名数据中获取推送服务公钥和第三随机数,使用推送服务公钥对第二签名值进行验证,如验证成功则将第二待签名数据返回给sdk,执行步骤261,如验证失败则给sdk返回错误信息,结束;具体的,在本实施例中,使用推送服务公钥对第二签名值进行验证,包括:使用推送服务公钥对第二签名值进行解密,对第二待签名数据进行哈希计算,判断哈希计算结果和解密结果是否匹配,是则验证成功,否则验证失败;步骤261:sdk接收第二待签名数据,判断第二待签名数据中的第三随机数与保存的第三随机数是否一致,是则执行步骤262,否则报错,结束;步骤262:sdk从第二待签名数据中获取推送服务公钥,根据设备归属信息和推送服务公钥生成hmac计算请求,将hmac计算请求发送给se;步骤263:se对接收到的hmac计算请求进行解析得到设备归属信息和推送服务公钥,使用推送服务公钥对设备归属信息进行hmac计算得到第二hmac值,将第二hmac值返回给sdk;步骤264:sdk接收到第二hmac值后,对推送服务公钥进行哈希计算得到推送服务公钥哈希值,将第二hmac值和推送服务公钥哈希值发送给se;步骤265:se接收第二hmac值和推送服务公钥哈希值并缓存,给sdk返回存储成功响应;步骤266:sdk接收到存储成功响应后,根据第二hmac值和设备所能接收的最大消息字节数生成第一加密签名请求,将第一加密签名请求发送给se;步骤267:se对接收到的第一加密签名请求进行解析得到第二hmac值和设备所能接收的最大消息字节数,使用设备私钥对第二hmac值和设备所能接收的最大消息字节数进行签名得到第四签名结果,使用第二密钥对第二hmac值和设备所能接收的最大消息字节数进行加密得到第二加密结果,将第二加密结果和第四签名结果返回给sdk;步骤268:sdk根据接收到的第二加密结果和第四签名结果生成设备状态变化通
知,将设备状态变化通知发送给推送服务;优选的,在本实施例中,将设备状态变化通知发送给推送服务,包括:sdk对设备状态变化通知进行cbor编码,将设备状态变化通知编码结果发送给推送服务;步骤269:推送服务对接收到的设备状态变化进行解析得到第二加密结果和第四签名结果,使用第一密钥对第二加密结果进行解密,解密成功得到第二hmac值和设备所能接收的最大消息字节数,使用保存的设备公钥对第四签名结果进行验证,如验证成功则执行步骤270,如验证失败则给sdk返回错误信息,结束;相应的,步骤269之前还包括:推送服务对接收到设备状态变化通知编码结果进行解码得到设备状态变化通知;优选的,在本实施例中,给sdk返回错误信息包括:推送服务对错误信息进行cbor编码,给sdk返回错误信息编码结果;具体的,使用保存的设备公钥对第四签名结果进行验证,包括:使用保存的设备公钥对第四签名结果进行解密,对第二hmac值和设备所能接收的最大消息字节数进行哈希计算,判断解密结果与哈希计算结果是否匹配,是则验证成功,否则验证失败;步骤270:推送服务根据设备所能接收的最大消息字节数生成服务接收数据的最大长度,使用推送服务私钥对服务接收数据的最大长度进行签名得到第五签名结果,使用第一密钥对服务接收数据的最大长度进行加密得到第三密文,根据第五签名结果和第三密文生成服务接收数据上限通知,将服务接收数据上限通知发送给sdk;优选的,在本实施例中,将服务接收数据上限通知发送给sdk,包括:推送服务对服务接收数据上限通知进行cbor编码并将服务接收数据上限通知编码结果发送给sdk;步骤271:sdk对接收到的服务接收数据上限通知进行解析得到第三密文和第五签名结果,根据第五签名结果和第三密文生成第二解密验签请求,将第二解密验签请求发送给se;相应的,步骤271之前还包括:sdk对接收到的服务接收数据上限通知编码结果进行解码得到服务接收数据上限通知;步骤272:se对第二解密验签请求进行解析得到第五签名结果和第三密文,使用第二密钥对第三密文进行解密,解密成功得到服务接收数据的最大长度,使用保存的推送服务公钥和服务接收数据的最大长度对第五签名结果进行验证,如验证成功则将服务接收数据的最大长度返回给sdk,执行步骤273,如验证失败则给sdk返回错误信息,结束;具体的,在本实施例中,使用保存的推送服务公钥和服务接收数据的最大长度对第五签名结果进行验证,包括:使用保存的推送服务公钥对第五签名结果进行解密,对服务接收数据的最大长度进行哈希计算,判断解密结果与哈希计算结果是否匹配,是则验证成功,否则验证失败;步骤273:sdk接收服务接收数据的最大长度并保存,根据保存的第三随机数生成第三加密签名请求,将第三加密签名请求发送给se;步骤274:se对接收到的第三加密签名请求进行解析得到第三随机数,使用第二密钥对第三随机数进行加密得到第四密文,使用设备私钥对第三随机数进行签名得到第六签名结果,将第四密文和第六签名结果发送给sdk;步骤275:sdk根据接收到的第四密文和第六签名结果生成确认请求,将确认请求
发送给推送服务;优选的,在本实施例中,sdk对确认请求进行cbor编码,将确认请求编码结果发送给sdk;步骤276:推送服务对接收到的确认请求进行解析得到第四密文和第六签名结果,使用第一密钥对第四密文进行解密,解密成功得到第三随机数,使用设备公钥和第三随机数对第六签名结果进行验证,如验证成功则执行步骤277,如验证失败则给sdk返回错误信息,结束;相应的,在步骤276之前还包括:推送服务对确认请求编码结果进行解码得到确认请求;优选的,在本实施例中,给sdk返回错误信息包括:推送服务对错误信息进行cbor编码,给sdk返回错误信息编码结果;具体的,使用设备公钥和第三随机数对第六签名结果进行验证,包括:使用设备公钥对第六签名结果进行解密,对第三随机数进行哈希计算,判断解密结果与哈希计算结果是否匹配,是则验证成功,否则验证失败;步骤277:推送服务使用推送服务私钥对第三随机数进行签名得到第七签名结果,使用第一密钥对第三随机数进行加密得到第五密文,根据第五密文和第七签名结果得到确认响应,将确认响应返回给sdk;优选的,在本实施例中,将确认响应返回给sdk包括:推送服务对确认响应进行cbor编码,将确认响应编码结果发送给sdk;步骤278:sdk对接收到的确认响应进行解析得到第五密文和第七签名结果,根据第五密文和第七签名结果生成第四解密验签请求,将第四解密验签请求发送给se;相应的,在步骤278之前包括:sdk对接收到的确认响应编码结果进行解码得到确认响应;步骤279:se对第四解密验签请求进行解析得到第五密文和第七签名结果,使用第二密钥对第五密文进行解密,解密成功得到第三随机数,使用第三随机数和推送服务公钥对第七签名结果进行验证,如验证成功则用第二hmac值替换保存的设备归属信息的头部hmac值,将第三随机数返回给sdk,执行步骤280,如验证失败则给sdk返回错误信息,结束;具体的,在本实施例中,使用第三随机数和推送服务公钥对第七签名结果进行验证,包括:对第三随机数进行哈希计算,使用推送服务对第七签名结果进行解密,判断哈希计算结果与解密结果是否匹配,是则验证成功,否则验证失败;步骤280:sdk接收到第三随机数后,生成运行请求响应,将运行请求响应返回给上层应用,将sdk状态设置为空闲;步骤281:上层应用接收运行请求响应,执行步骤282;步骤282:上层应用根据设备标识生成用户名,使用se生成的第二密钥加密用户名生成密码,根据用户名和密码生成长连接请求,根据sdk保存的重定向信息中的推送服务地址将长连接请求发送给对应的推送服务;步骤283:推送服务对接收到的长连接请求进行解析得到用户名和密码,根据用户名和密码验证用户身份,如合法则执行步骤284,如不合法则给上层应用返回错误信息,结束;
具体的,在本实施例中,步骤283包括:步骤283-1:推送服务解析长连接请求得到用户名和密码,根据保存的设备标识生成新的用户名,判断解析得到的用户名与新的用户名是否一致,是则执行步骤283-2,否则验证失败,给上层应用返回错误信息,结束;步骤283-2:推送服务根据匹配的新的用户名对应的设备标识获取对应的第一密钥,使用第一密钥对解析得到的用户名进行加密,判断加密结果与解析得到的密码是否一致,是则执行步骤284,如不合法则给上层应用返回错误信息,结束;步骤284:推送服务与上层应用建立长连接,给上层应用返回连接成功响应;步骤285:上层应用接收到连接成功响应后与推送服务开始进行业务通讯;在本实施例中,上层应用与推送服务成功建立长连接后,上层应用开始向推送服务发送业务请求,进行业务处理。
实施例三
[0019]
本发明实施例三提供一种物联网终端设备的注册和连接实现装置,如图7所示,包括:第一判断发送模块,用于当sdk接收到上层应用的调用时,判断自身状态,如为空闲则给上层应用返回空闲状态,触发发送接收建立模块,如为非空闲则给上层应用返回非空闲状态,在接收到上层应用发送的运行请求时判断sdk的非空闲状态的类型,如为制造前则触发判断生成模块,如为载入前则触发第二签名生成发送模块,如为转让前则触发第一生成发送模块;在本实施例中,sdk的状态的初始值为非空闲状态的制造前;判断生成模块,用于判断是否保存有设备公钥,是则触发第一签名生成发送模块,否则通知se生成设备密钥对,触发第一签名生成发送模块;第一签名生成发送模块,用于使用se中的设备私钥对设备标识进行签名得到第一签名结果,根据第一签名结果、设备标识和设备公钥生成设备初始化启动请求,根据预置的制造站地址将设备初始化启动请求发送给制造站;接收保存计算模块,用于对接收到的制造站返回的设备归属信息的头部进行解析得到制造站公钥、认证中心地址和设备证书并保存,通过se对设备归属信息的头部进行hmac计算,将设备归属信息的头部hmac值发送给制造站;第一接收保存设置模块,用于接收到制造站返回的成功响应后对制造站公钥计算哈希得到制造站公钥哈希值,将制造站公钥哈希值与设备归属信息的头部hmac值对应保存在se中,将sdk的非空闲状态设置为载入前,触发第二签名生成发送模块;第二签名生成发送模块,用于根据设备标识生成载入请求并发送给认证中心,对接收到的认证中心返回的载入请求响应进行解析得到第一随机数,通过se中的设备私钥对第一随机数和设备标识进行签名得到第二签名结果,根据第一随机数、设备标识和第二签名结果生成身份验证请求并发送给认证中心;第二接收保存设置模块,用于接收到认证中心返回的重定向信息并保存,将sdk的非空闲状态设置为转让前,触发第一生成发送模块;第一生成发送模块,用于根据设备标识、se生成的第二随机数生成设备连接请求,
根据保存的重定向信息中的推送服务地址将设备连接请求发送给对应的推送服务;验证生成发送模块,用于对接收到的推送服务返回的设备连接响应中的数据进行验证,如验证成功则通过se中的设备私钥对设备标识和密钥交换参数进行签名得到第三签名结果,保存设备连接响应中的第三随机数,根据设备标识、密钥交换参数、第三签名结果和和第三随机数生成设备证明请求并发送给推送服务;生成验证保存模块,用于当接收到推送服务返回的设备归属信息重置请求时根据密钥交换参数生成第二密钥,使用第二密钥对设备归属信息重置请求进行解密并验证解密结果,如验证成功则判断解密结果中的第三随机数和保存的第三随机数是否一致,是则对设备归属信息重置请求中的设备归属信息进行hmac计算得到第二hmac值,对设备归属信息重置请求中的推送服务公钥计算哈希值,并将推送服务公钥哈希值和第二hmac值缓存在se中;发送接收设置模块,用于将设备状态变化通知发送给推送服务,当接收到推送服务返回的确认响应时用第二hmac值替换se中保存的设备归属信息的头部hmac值,给上层应用返回运行请求响应,将sdk状态设置为空闲并返回给上层应用,触发发送接收建立模块;发送接收建立模块,用于当接收到sdk返回的空闲状态时,上层应用根据设备标识和第二密钥生成长连接请求并发送给推送服务,当接收到推送服务返回的连接成功响应时与推送服务建立长连接。
[0020]
可选的,本技术的实施例还提供了一种电子设备,电子设备包括至少一个处理器、存储器及存储在该存储器上并可被至少一个处理器执行的指令,至少一个处理器执行该指令以实现上述实施例中的一种物联网终端设备的注册和连接实现方法。该物联网设备是芯片系统时,可以由芯片构成,也可以包含芯片和其他分立器件,本技术实施例对此不作具体限定;该芯片与存储器耦合,用于执行存储器中存储的计算机程序,以执行上述实施例中公开的一种物联网终端设备的注册和连接实现方法。
[0021]
在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件程序实现时,可以全部或部分地以计算机程序产品的形式来实现。该计算机程序产品包括一个或多个计算机程序。在物联网设备上加载和执行计算机程序时,全部或部分地产生按照本技术实施例所述的流程或功能。该计算机程序可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个基站、物联网设备、服务器或者数据中心通过有线(例如同轴电缆、光纤、数字用户线(digital subscriber line,dsl))或无线(例如红外、无线、微波等)方式向另一个基站、物联网设备、服务器或数据中心进行传输。所述计算机可读存储介质可以是物联网设备能够存取的任何可用介质或者是包含一个或多个可以用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质(例如,软盘、硬盘、磁带),光介质(例如,dvd)、 或者半导体介质(例如固态硬盘(solid state disk,ssd))等。本技术实施例中,物联网设备可以包括前面所述的装置。
[0022]
尽管在此结合各实施例对本技术进行了描述,然而,在实施所要求保护的本技术过程中,本领域技术人员通过查看所述附图、公开内容、以及所附权利要求书,可理解并实现所述公开实施例的其他变化。在权利要求中,“包括”(comprising)一词不排除其他组成部分或步骤,“一”或“一个”不排除多个的情况。单个处理器或其他单元可以实现权利要求
中列举的若干项功能。相互不同的从属权利要求中记载了某些措施,但这并不表示这些措施不能组合起来产生良好的效果。
[0023]
尽管结合具体特征及其实施例对本技术进行了描述,显而易见的,在不脱离本技术的精神和范围的情况下,可对其进行各种修改和组合。相应地,本说明书和附图仅仅是所附权利要求所界定的本技术的示例性说明,且视为已覆盖本技术范围内的任意和所有修改、变化、组合或等同物。显然,本领域的技术人员可以对本技术进行各种改动和变型而不脱离本技术的精神和范围。这样,倘若本技术的这些修改和变型属于本技术权利要求及其等同技术的范围之内,则本技术也意图包含这些改动和变型在内。

技术特征:
1.一种物联网终端设备的注册和连接实现方法,其特征在于,适用于包含sdk、se、上层应用的终端设备,所述终端设备上电之后所述方法包括:步骤s1:当所述sdk接收到所述上层应用的调用时,判断sdk的状态,如为空闲则给所述上层应用返回空闲状态,执行步骤s12,如为非空闲则给所述上层应用返回非空闲状态,在接收到所述上层应用发送的运行请求时判断sdk的非空闲状态的类型,如为制造前则执行步骤s2,如为载入前则执行步骤s6,如为转让前则执行步骤s8,所述sdk的状态的初始值为非空闲状态的制造前;步骤s2:所述sdk判断是否保存有设备公钥,是则执行步骤s3,否则通知所述se生成设备密钥对,执行步骤s3;步骤s3:所述sdk使用所述se中的设备私钥对设备标识进行签名得到第一签名结果,根据所述第一签名结果、所述设备标识和设备公钥生成设备初始化启动请求,根据预置的制造站地址将所述设备初始化启动请求发送给制造站;步骤s4:所述sdk对接收到的所述制造站返回的设备归属信息的头部进行解析得到制造站公钥、认证中心地址和设备证书并保存,通过所述se对所述设备归属信息的头部进行hmac计算,将设备归属信息的头部hmac值发送给所述制造站;步骤s5:所述sdk接收到所述制造站返回的成功响应后对所述制造站公钥计算哈希得到制造站公钥哈希值,将所述制造站公钥哈希值与所述设备归属信息的头部hmac值对应保存在所述se中,将sdk的非空闲状态设置为载入前,执行步骤s6;步骤s6:所述sdk根据设备标识生成载入请求并发送给认证中心,对接收到的所述认证中心返回的载入请求响应进行解析得到第一随机数,通过所述se中的设备私钥对所述第一随机数和设备标识进行签名得到第二签名结果,根据所述第一随机数、所述设备标识和所述第二签名结果生成身份验证请求并发送给所述认证中心;步骤s7:所述sdk接收到所述认证中心返回的重定向信息并保存,将sdk的非空闲状态设置为转让前,执行步骤s8;步骤s8:所述sdk根据设备标识、所述se生成的第二随机数生成设备连接请求,根据保存的重定向信息中的推送服务地址将所述设备连接请求发送给对应的推送服务;步骤s9:所述sdk对接收到的所述推送服务返回的设备连接响应中的数据进行验证,如验证成功则通过所述se中的设备私钥对所述设备标识和生成的密钥交换参数进行签名得到第三签名结果,保存所述设备连接响应中的第三随机数,根据所述设备标识、密钥交换参数、第三签名结果和所述第三随机数生成设备证明请求并发送给所述推送服务;步骤s10:当所述sdk接收到所述推送服务返回的设备归属信息重置请求时根据所述密钥交换参数生成第二密钥,使用所述第二密钥对所述设备归属信息重置请求进行解密并验证解密结果,如验证成功则判断解密结果中的第三随机数和保存的第三随机数是否一致,是则对所述设备归属信息重置请求中的设备归属信息进行hmac计算得到第二hmac值,对所述设备归属信息重置请求中的推送服务公钥计算哈希值,并将推送服务公钥哈希值和所述第二hmac值缓存在所述se中;步骤s11:所述sdk将设备状态变化通知发送给所述推送服务,当接收到所述推送服务返回的确认响应时用所述第二hmac值替换所述se中保存的设备归属信息的头部hmac值,给所述上层应用返回运行请求响应,将sdk状态设置为空闲并返回给所述上层应用,执行步骤
s12;步骤s12:当所述上层应用接收到所述sdk返回的空闲状态时,所述上层应用根据所述设备标识和所述第二密钥生成长连接请求并发送给推送服务,当接收到所述推送服务返回的连接成功响应时与所述推送服务建立长连接。2.如权利要求1所述的方法,其特征在于,所述步骤s1之前还包括:步骤a1:所述上层应用组装sdk初始化指令并发送给所述sdk;步骤a2:所述sdk接收到所述sdk初始化指令后进行初始化,组装se初始化请求并发送给所述se;步骤a3:所述se接收到se初始化请求后进行初始化,给所述sdk返回se初始化响应;步骤a4:所述sdk接收se初始化响应,组装获取se状态请求并发送给所述se;步骤a5:所述se接收到获取所述se状态请求后组装se状态响应并返回给所述sdk;步骤a6:所述sdk根据接收到的所述se状态响应中的状态码判断是否需要对se执行复位操作,是则调用se复位接口,进行se复位操作,否则组装sdk初始化响应并返回给所述上层应用。3.如权利要求1所述的方法,其特征在于,步骤s1包括:步骤s1-1:所述上层应用组装获取sdk状态请求并发送给所述sdk;步骤s1-2:所述sdk接收到获取sdk状态请求后,根据sdk状态组装sdk状态响应并返回给所述上层应用;步骤s1-3:所述上层应用接收所述sdk状态响应并解析,判断解析得到的sdk的状态的类型,如为非空闲给所述sdk发送运行请求,则执行步骤s1-4,如为空闲则执行步骤s12,如为错误则报错,结束;步骤s1-4:所述sdk判断sdk的非空闲状态的类型,如为制造前则执行步骤s2,如为载入前则执行步骤s6,如为转让前则执行步骤s8。4.如权利要求1所述的方法,其特征在于,所述步骤s2包括:步骤s21:所述sdk判断是否保存有设备公钥,是则执行步骤s3,否则执行步骤s22;步骤s22:所述sdk组装生成密钥请求,将生成密钥请求发送给所述se;步骤s23:所述se接收到生成密钥请求后根据预设算法生成设备密钥对,将所述设备密钥对中的设备公钥返回给所述sdk;步骤s24:所述sdk接收设备公钥并保存,执行步骤s3。5.如权利要求1所述的方法,其特征在于,所述步骤s3包括:步骤s31:所述sdk根据设备标识、公钥类型、公钥编码、证书申请信息组装设备初始化签名请求,将设备初始化签名请求发送给所述se;步骤s32:所述se使用设备私钥对接收到的设备初始化签名请求进行签名得到第一签名结果,将第一签名结果返回给sdk;步骤s33:所述sdk根据接收到的第一签名结果、所述设备初始化签名请求和保存的所述设备公钥组装设备初始化启动请求,根据预置的制造站地址将所述设备初始化启动请求发送给制造站;所述步骤s3与所述步骤s4之间还包括:步骤b1:所述制造站对接收到所述设备初始化启动请求进行解析得到第一签名结果、
所述设备初始化签名请求和设备公钥,使用所述设备公钥和所述设备初始化签名请求对所述第一签名结果进行验签,如验签成功则对所述设备初始化签名请求进行解析得到设备标识、公钥类型、公钥编码、证书申请信息,根据所述设备标识判断是否保存有对应的设备证书,是则报错,结束,否则根据所述设备公钥、所述公钥类型、所述公钥编码、所述证书申请信息和所述设备标识生成设备证书并与所述设备标识对应保存,执行步骤b2;步骤b2:所述制造站根据制造站公钥、所述设备证书、认证中心地址、协议版本号生成设备归属信息的头部,将所述设备归属信息的头部发送给所述sdk。6.如权利要求1所述的方法,其特征在于,所述步骤s4中的通过所述se对所述设备归属信息的头部进行hmac计算,将设备归属信息的头部hmac值发送给所述制造站,包括:所述sdk根据所述设备归属信息的头部生成第一hmac计算请求,将所述第一hmac计算请求发送给所述se;所述se对接收到的所述第一hmac计算请求进行解析,对解析得到的设备归属信息的头部进行hmac计算,将计算得到的设备归属信息的头部hmac值返回给所述sdk,所述sdk将所述设备归属信息的头部和接收到的设备归属信息的头部hmac值发送给所述制造站。7.如权利要求1所述的方法,其特征在于,所述步骤s4与所述步骤s5之间还包括:所述制造站对保存的推送服务公钥进行哈希计算得到推送服务公钥哈希值,根据所述设备归属信息的头部、接收到的所述设备归属信息的头部hmac值和所述推送服务公钥哈希值组装设备归属信息并与所述设备标识对应保存,组装成功响应并发送给所述sdk;所述步骤s5包括:步骤s51:所述sdk接收到成功响应后对制造站公钥计算哈希得到制造站公钥哈希值,将所述设备归属信息的头部hmac值和所述制造站公钥哈希值发送给所述se;步骤s52:所述se保存接收到的所述设备归属信息的头部hmac值和所述制造站公钥哈希值,给所述sdk返回存储成功响应;步骤s53:所述sdk接收到所述存储成功响应后将sdk的非空闲状态设置为载入前,给所述上层应用返回运行请求响应,执行步骤s6。8.如权利要求1所述的方法,其特征在于,所述步骤s6包括:步骤s61:所述sdk根据所述设备标识生成载入请求,并将所述载入请求发送给认证中心;步骤s62:所述认证中心对接收到的所述载入请求进行解析,根据解析得到的设备标识判断是否保存有对应的协议数据,是则执行步骤s63,否则给所述sdk返回错误信息,结束;步骤s63:所述认证中心生成第一随机数并与设备标识对应保存,根据第一随机数生成载入请求响应,将所述载入请求响应返回给所述sdk;步骤s64:所述sdk对接收到的载入请求响应进行解析得到第一随机数,根据所述第一随机数和所述设备标识组装签名请求,将所述签名请求发送给所述se;步骤s65:所述se对接收到的签名请求进行解析得到第一随机数和设备标识,使用设备私钥对所述第一随机数和所述设备标识进行签名得到第二签名结果,将所述第二签名结果发送给所述sdk;步骤s66:所述sdk根据接收到的所述第二签名结果、所述第一随机数和所述设备标识生成身份验证请求,将所述身份验证请求发送给所述认证中心。
9.如权利要求8所述的方法,其特征在于,所述步骤s6与所述步骤s7之间还包括:步骤c1:所述认证中心对接收到的身份验证请求进行解析得到第二签名结果、第一随机数和设备标识,根据所述设备标识获取本地保存的对应的第一随机数;步骤c2:所述认证中心判断获取到的第一随机数与解析得到的第一随机数是否一致,是则执行步骤c3,否则给所述sdk返回错误信息,结束;步骤c3:所述认证中心根据所述设备标识获取对应的协议数据,使用所述协议数据中的设备公钥对所述第二签名结果进行验证,如验证成功则执行步骤c4,如验证失败则给所述sdk返回错误信息,结束;步骤c4:所述认证中心根据所述协议数据中的推送服务地址和签名数据生成重定向信息,将所述重定向信息返回给所述sdk。10.如权利要求1所述的方法,其特征在于,所述步骤s8包括:步骤s81:所述sdk生成随机数产生请求并发送给所述se;步骤s82:所述se接收到所述随机数产生请求后生成第二随机数,将所述第二随机数返回给所述sdk;步骤s83:所述sdk保存接收到的所述第二随机数,生成密码交换算法参数获取请求并发送给所述se;步骤s84:所述se接收到所述密码交换算法参数获取请求后获取ecdh密码协议和密码套件,将所述ecdh密码协议和所述密码套件返回给所述sdk;步骤s85:所述sdk根据接收到的所述ecdh密码协议和所述密码套件、保存的第二随机数、设备标识生成设备连接请求,根据保存的重定向信息中的推送服务地址将所述设备连接请求发送给对应的推送服务。11.如权利要求1所述的方法,其特征在于,所述步骤s8与所述步骤s9之间还包括:所述推送服务对接收到的设备连接请求进行解析得到ecdh密码协议、密码套件、第二随机数和设备标识,根据所述设备标识查找保存的设备归属信息,根据ecdh密码协议和密码套件生成第一参数,对所述设备连接请求进行哈希计算得到设备连接请求哈希值,根据设备归属信息的头部、设备归属信息中的hamc、所述第二随机数、所述第一参数、设备连接请求哈希值生成第一待签名数据,使用推送服务私钥对所述第一待签名数据进行签名得到第一签名值,根据所述第一待签名数据、所述第一签名值、推送服务公钥和生成的第三随机数生成设备连接响应并返回给所述sdk,保存所述第三随机数。12.如权利要求11所述的方法,其特征在于,所述步骤s9包括:步骤s9-1:所述sdk对接收到的所述设备连接响应进行解析得到第一待签名数据、第一签名值、推送服务公钥和第三随机数,保存第三随机数,对所述第一待签名数据进行解析得到设备归属信息的头部、设备归属信息中的hamc、第二随机数、第一参数、设备连接请求哈希值,生成hmac读取请求并发送给所述se;步骤s9-2:所述se接收到所述hmac读取请求后读取保存的设备归属信息的头部hmac值,将所述设备归属信息的头部hmac值返回给sdk;步骤s9-3:所述sdk判断接收到的设备归属信息的头部hmac值与解析得到的设备归属信息中的hmac是否一致,是则执行步骤s9-4,否则报错,结束;步骤s9-4:所述sdk根据保存的重定向信息和推送服务公钥生成载入期间的重定向信
息验证请求并发送给所述se;步骤s9-5:所述se对接收到的载入期间的重定向信息验证请求进行解析得到重定向信息和推送服务公钥,使用所述推送服务公钥对所述重定向信息中的签名数据进行验签,并将验签结果返回给所述sdk;步骤s9-6:所述sdk判断接收到的验签结果是否为成功,是则执行步骤s9-7,否则报错,结束;步骤s9-7:所述sdk根据所述第一待签名数据、所述第一签名值和推送服务公钥生成验签请求并发送给所述se;步骤s9-8:所述se对接收到验签请求进行解析得到第一待签名数据、第一签名值和推送服务公钥,使用所述第一待签名数据和所述推送服务公钥对所述第一签名值进行验签,并将验签结果返回给所述sdk;步骤s9-9:所述sdk判断接收到的验签结果是否为成功,是则执行步骤s9-10,否则报错,结束;步骤s9-10:所述sdk将所述设备标识和所述第一参数发送给所述se;步骤s9-11:所述se对接收到的第一参数进行计算得到密钥交换参数并缓存,使用设备私钥对所述设备标识和所述密钥交换参数进行签名得到第三签名结果,将所述第三签名结果和所述密钥交换参数返回给所述sdk;步骤s9-12:所述sdk根据接收到的所述第三签名结果和所述密钥交换参数、所述设备标识、第三随机数生成设备证明请求,将所述设备证明请求发送给所述推送服务。13.如权利要求1所述的方法,其特征在于,所述步骤s9与所述步骤s10之间还包括:步骤d1:所述推送服务对接收到的所述设备证明请求进行解析得到第三签名结果、密钥交换参数、设备标识和第三随机数,根据所述设备标识从对应的设备归属信息中获取设备公钥,使用所述设备公钥对所述第三签名结果进行验证,如验证成功则执行步骤d2,如验证失败则给所述sdk返回错误信息,结束;步骤d2:所述推送服务判断解析得到的第三随机数与保存的第三随机数是否一致,是则执行步骤d3,否则给sdk返回错误信息,结束;步骤d3:所述推送服务根据所述密钥交换参数生成第一密钥,根据推送服务公钥、所述设备归属信息、所述设备标识和所述第三随机数生成第二待签名数据,使用推送服务私钥对所述第二待签名数据进行签名得到第二签名值,使用所述第一密钥对所述第二待签名数据进行加密得到第一加密结果,根据所述第一加密结果和所述第二签名值生成设备归属信息重置请求,将所述设备归属信息重置请求发送给所述sdk。14.如权利要求13所述的方法,其特征在于,所述步骤s10包括:步骤s10-1:所述sdk对接收到的所述推送服务返回的设备归属信息重置请求进行解析得到第一加密结果和第二签名值,根据所述第一加密结果和所述第二签名值生成第一解密验签请求,将所述第一解密验签请求发送给所述se;步骤s10-2:所述se对接收到的第一解密验签请求进行解析得到第一加密结果和第二签名值,根据缓存的密钥交换参数生成第二密钥,使用所述第二密钥对所述第一加密结果进行解密,解密成功得到第二待签名数据;步骤s10-3:所述se从所述第二待签名数据中获取推送服务公钥和第三随机数,使用所
述推送服务公钥对所述第二签名值进行验证,如验证成功则将所述第二待签名数据返回给所述sdk,执行步骤s10-4,如验证失败则给所述sdk返回错误信息,结束;步骤s10-4:所述sdk接收所述第二待签名数据,判断获取的所述的第三随机数与保存的第三随机数是否一致,是则执行步骤s10-5,否则给sdk返回错误信息,结束;步骤s10-5:所述sdk从所述第二待签名数据中获取推送服务公钥,根据保存的设备归属信息和所述推送服务公钥生成hmac计算请求,将所述hmac计算请求发送给所述se;步骤s10-6:所述se对接收到的所述hmac计算请求进行解析得到设备归属信息和推送服务公钥,使用所述推送服务公钥对所述设备归属信息进行hmac计算得到第二hmac值,将所述第二hmac值返回给所述sdk;步骤s10-7:所述sdk接收到所述第二hmac值后,对所述推送服务公钥进行哈希计算得到推送服务公钥哈希值,将所述第二hmac值和所述推送服务公钥哈希值发送给所述se;步骤s10-8:所述se接收所述第二hmac值和所述推送服务公钥哈希值并保存,给所述sdk返回存储成功响应。15.如权利要求1所述的方法,其特征在于,所述步骤s11包括:所述sdk根据设备所能接收的最大消息字节数生成设备状态变化通知,将所述设备状态变化通知发送给所述推送服务,接收所述推送服务返回的服务接收数据的最大长度,给所述推送服务发送确认请求并当接收到所述推送服务返回的确认响应时将sdk状态设置为空闲,给所述上层应用返回运行请求响应,执行步骤s12。16.如权利要求14所述的方法,其特征在于,所述步骤s11具体包括:步骤s11-1:所述sdk接收到所述存储成功响应后,根据所述第二hmac值和设备所能接收的最大消息字节数生成第一加密签名请求,将所述第一加密签名请求发送给所述se;步骤s11-2:所述se对接收到的所述第一加密签名请求进行解析得到第二hmac值和设备所能接收的最大消息字节数,使用设备私钥对所述第二hmac值和所述设备所能接收的最大消息字节数进行签名得到第四签名结果,使用所述第二密钥对所述第二hmac值和所述设备所能接收的最大消息字节数进行加密得到第二加密结果,将所述第二加密结果和所述第四签名结果返回给所述sdk;步骤s11-3:所述sdk根据接收到的所述第二加密结果和所述第四签名结果生成设备状态变化通知,将所述设备状态变化通知发送给所述推送服务;步骤s11-4:所述推送服务对接收到的所述设备状态变化通知进行解析得到第二加密结果和第四签名结果,使用所述第一密钥对所述第二加密结果进行解密,解密成功得到第二hmac值和设备所能接收的最大消息字节数,使用保存的设备公钥对所述第四签名结果进行验证,如验证成功则执行步骤s11-5,如验证失败则给所述sdk返回错误信息,结束;步骤s11-5:所述推送服务根据所述设备所能接收的最大消息字节数生成服务接收数据的最大长度,使用推送服务私钥对所述服务接收数据的最大长度进行签名得到第五签名结果,使用所述第一密钥对所述服务接收数据的最大长度进行加密得到第三密文,根据所述第五签名结果和所述第三密文生成服务接收数据上限通知,将所述服务接收数据上限通知发送给所述sdk;步骤s11-6:所述sdk对接收到的所述服务接收数据上限通知进行解析得到第三密文和第五签名结果,根据所述第五签名结果和所述第三密文生成第二解密验签请求,将所述第
二解密验签请求发送给所述se;步骤s11-7:所述se对所述第二解密验签请求进行解析得到第五签名结果和第三密文,使用第二密钥对第三密文进行解密,解密成功得到服务接收数据的最大长度,使用保存的推送服务公钥和所述服务接收数据的最大长度对所述第五签名结果进行验证,如验证成功则将所述服务接收数据的最大长度返回给所述sdk,执行步骤s11-8,如验证失败则给所述sdk返回错误信息,结束;步骤s11-8:所述sdk接收所述服务接收数据的最大长度并保存,根据保存的所述第三随机数生成第三加密签名请求,将所述第三加密签名请求发送给所述se;步骤s11-9:所述se对接收到的所述第三加密签名请求进行解析得到第三随机数,使用所述第二密钥对所述第三随机数进行加密得到第四密文,使用设备私钥对所述第三随机数进行签名得到第六签名结果,将所述第四密文和所述第六签名结果发送给所述sdk;步骤s11-10:sdk根据接收到的所述第四密文和所述第六签名结果生成确认请求,将所述确认请求发送给所述推送服务;步骤s11-11:所述推送服务对接收到的所述确认请求进行解析得到第四密文和第六签名结果,使用所述第一密钥对所述第四密文进行解密,解密成功得到第三随机数,使用设备公钥和所述第三随机数对所述第六签名结果进行验证,如验证成功则执行步骤s11-12,如验证失败则给所述sdk返回错误信息,结束;步骤s11-12:所述推送服务使用所述推送服务私钥对所述第三随机数进行签名得到第七签名结果,使用所述第一密钥对第三随机数进行加密得到第五密文,根据所述第五密文和所述第七签名结果得到确认响应,将所述确认响应返回给所述sdk;步骤s11-13:所述sdk对接收到的所述确认响应进行解析得到第五密文和第七签名结果,根据所述第五密文和所述第七签名结果生成第四解密验签请求,将所述第四解密验签请求发送给所述se;步骤s11-14:所述se对接收到的所述第四解密验签请求进行解析得到第五密文和第七签名结果,使用所述第二密钥对所述第五密文进行解密,解密成功得到第三随机数,使用所述第三随机数和所述推送服务公钥对所述第七签名结果进行验证,如验证成功则用所述第二hmac值替换保存的设备归属信息的头部hmac值,将所述第三随机数返回给所述sdk,执行步骤s11-15,如验证失败则给所述sdk返回错误信息,结束;步骤s11-15:所述sdk接收到第三随机数后将sdk状态设置为空闲,执行步骤s12。17.如权利要求1所述的方法,其特征在于,所述步骤s12包括:步骤s12-1:所述上层应用根据设备标识生成用户名,使用所述第二密钥加密所述用户名生成密码,根据所述用户名和所述密码生成长连接请求,根据所述sdk保存的重定向信息中的推送服务地址将所述长连接请求发送给对应的推送服务;步骤s12-2:所述推送服务对接收到的长连接请求进行解析得到用户名和密码,根据所述用户名和所述密码验证用户身份,如验证合法则执行步骤s12-3,如不合法则给所述上层应用返回错误信息,结束;步骤s12-3:所述推送服务与所述上层应用建立长连接,给所述上层应用返回连接成功响应;步骤s12-4:所述上层应用接收到连接成功响应后与所述推送服务开始进行业务通讯。
18.如权利要求17所述的方法,其特征在于,所述步骤s12-2包括:步骤q1:所述推送服务解析长连接请求得到用户名和密码,根据保存的设备标识生成新的用户名,判断解析得到的用户名与所述新的用户名是否一致,是则执行步骤q2,否则验证失败,给所述上层应用返回错误信息,结束;步骤q2:所述推送服务根据匹配的新的用户名对应的设备标识获取对应的第一密钥,使用所述第一密钥对解析得到的用户名进行加密,判断加密结果与解析得到的密码是否一致,是则执行步骤s12-3,如不合法则给所述上层应用返回错误信息,结束。19.一种物联网终端设备的注册和连接实现装置,其特征在于,包括:第一判断发送模块,用于当sdk接收到上层应用的调用时,判断sdk的状态,如为空闲则给所述上层应用返回空闲状态,触发发送接收建立模块,如为非空闲则给所述上层应用返回非空闲状态,在接收到所述上层应用发送的运行请求时判断sdk的非空闲状态的类型,如为制造前则触发判断生成模块,如为载入前则触发第二签名生成发送模块,如为转让前则触发第一生成发送模块,所述sdk的状态的初始值为非空闲状态的制造前;所述判断生成模块,用于判断是否保存有设备公钥,是则触发第一签名生成发送模块,否则通知se生成设备密钥对,触发第一签名生成发送模块;所述第一签名生成发送模块,用于使用所述se中的设备私钥对设备标识进行签名得到第一签名结果,根据所述第一签名结果、所述设备标识和设备公钥生成设备初始化启动请求,根据预置的制造站地址将所述设备初始化启动请求发送给制造站;接收保存计算模块,用于对接收到的所述制造站返回的设备归属信息的头部进行解析得到制造站公钥、认证中心地址和设备证书并保存,通过所述se对所述设备归属信息的头部进行hmac计算,将设备归属信息的头部hmac值发送给所述制造站;第一接收保存设置模块,用于接收到所述制造站返回的成功响应后对所述制造站公钥计算哈希得到制造站公钥哈希值,将所述制造站公钥哈希值与所述设备归属信息的头部hmac值对应保存在所述se中,将sdk的非空闲状态设置为载入前,触发第二签名生成发送模块;所述第二签名生成发送模块,用于根据设备标识生成载入请求并发送给认证中心,对接收到的所述认证中心返回的载入请求响应进行解析得到第一随机数,通过所述se中的设备私钥对所述第一随机数和设备标识进行签名得到第二签名结果,根据所述第一随机数、所述设备标识和所述第二签名结果生成身份验证请求并发送给所述认证中心;第二接收保存设置模块,用于接收到所述认证中心返回的重定向信息并保存,将sdk的非空闲状态设置为转让前,触发第一生成发送模块;所述第一生成发送模块,用于根据设备标识、所述se生成的第二随机数生成设备连接请求,根据保存的重定向信息中的推送服务地址将所述设备连接请求发送给对应的推送服务;验证生成发送模块,用于对接收到的所述推送服务返回的设备连接响应中的数据进行验证,如验证成功则通过所述se中的设备私钥对所述设备标识和密钥交换参数进行签名得到第三签名结果,保存所述设备连接响应中的第三随机数,根据所述设备标识、密钥交换参数、第三签名结果和和所述第三随机数生成设备证明请求并发送给所述推送服务;生成验证保存模块,用于当接收到所述推送服务返回的设备归属信息重置请求时根据
所述密钥交换参数生成第二密钥,使用所述第二密钥对所述设备归属信息重置请求进行解密并验证解密结果,如验证成功则判断解密结果中的第三随机数和保存的第三随机数是否一致,是则对所述设备归属信息重置请求中的设备归属信息进行hmac计算得到第二hmac值,对所述设备归属信息重置请求中的推送服务公钥计算哈希值,并将推送服务公钥哈希值和所述第二hmac值缓存在所述se中;发送接收设置模块,用于将设备状态变化通知发送给所述推送服务,当接收到所述推送服务返回的确认响应时用所述第二hmac值替换所述se中保存的设备归属信息的头部hmac值,给所述上层应用返回运行请求响应,将sdk状态设置为空闲并返回给所述上层应用,触发发送接收建立模块;所述发送接收建立模块,用于当接收到所述sdk返回的空闲状态时,所述上层应用根据所述设备标识和所述第二密钥生成长连接请求并发送给推送服务,当接收到所述推送服务返回的连接成功响应时与所述推送服务建立长连接。20.一种电子设备,其特征在于,所述电子设备包括至少一个处理器、存储器及存储在所述存储器上并可被所述至少一个处理器执行的指令,所述至少一个处理器执行所述指令以实现权利要求1至18任一项所述的物联网终端设备的注册和连接实现方法。21.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质包括计算机程序,当所述计算机程序被执行时实现如权利要求1至18任一项所述的物联网终端设备的注册和连接实现方法。22.一种芯片系统,其特征在于,包括芯片,所述芯片与存储器耦合,用于执行所述存储器中存储的计算机程序,以执行权利要求1-18任一项所述的物联网终端设备的注册和连接实现方法。

技术总结
本发明公开一种物联网终端设备的注册和连接实现方法及装置,适用于包含SDK、SE、上层应用的终端设备,当SDK接收到上层应用的调用时,判断SDK的状态的类型,如为制造前则将制造站公钥哈希值与设备归属信息的头部HMAC值对应保存在SE中,将SDK的非空闲状态设置为载入前;如为载入前则保存认证中心返回的重定向信息,将SDK的非空闲状态设置为转让前;如为转让前则用第二HMAC值替换SE中设备归属信息的头部HMAC值,将SDK状态设置为空闲;如为空闲则给上层应用返回空闲状态,上层应用与推送服务建立长连接进行业务处理。本发明将终端设备的注册、连接与业务处理进行区分,安全方便。安全方便。安全方便。


技术研发人员:许可 陆舟
受保护的技术使用者:飞天诚信科技股份有限公司
技术研发日:2023.07.11
技术公布日:2023/8/9
版权声明

本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

航空之家 https://www.aerohome.com.cn/

飞机超市 https://mall.aerohome.com.cn/

航空资讯 https://news.aerohome.com.cn/

分享:

扫一扫在手机阅读、分享本文

相关推荐