一种实现智能密钥设备双向认证的方法
【专利摘要】本发明公开了一种实现智能密钥设备双向认证的方法,属于信息安全领域。所述方法包括:当客户端监听到系统组件发起的网络请求时,截获网络请求,客户端从智能密钥设备中获取证书,接收用户选择的证书,创建私钥对象,并对其进行构造和初始化,将用户选择的证书和私钥对象分别注册为客户端证书和客户端私钥对象,当创建连接函数被调用时,客户端请求服务器证书,验证服务器证书通过后,根据客户端证书和客户端证书私钥对象进行签名,将签名结果和客户端证书发给服务器,接收服务器返回的结果,当结果为成功时,成功创建SSL双向认证。采用本发明所述方案能够实现在移动设备中,使用智能密钥设备进行SSL双向认证。
【专利说明】一种实现智能密钥设备双向认证的方法
【技术领域】
[0001]本发明涉及信息安全领域,尤其涉及一种实现智能密钥设备双向认证的方法。
【背景技术】
[0002]SSL是Secure Socket Layer的英文缩写,意思是安全套接层协议,指使用公钥和私钥技术组合的安全网络通讯协议。SSL协议是网景公司(Netscape)推出的基于WEB应用的安全协议,SSL协议指定了一种在应用程序协议(如Http、Telenet、NMTP和FTP等)和TCP/IP协议之间提供数据安全性分层的机制,它为TCP/IP连接提供数据加密、服务器认证、消息完整性以及可选的客户机认证,主要用于提高应用程序之间数据的安全性,对传送的数据进行加密和隐藏,确保数据在传送中不被改变,即确保数据的完整性。
[0003]发明人在实现本发明的过程中,发现在移动设备中,无法通过原生接口,使用智能密钥设备进行SSL双向认证。
【发明内容】
[0004]本发明的目的是解决现有技术中存在的问题,提供了一种实现智能密钥设备双向认证的方法。
[0005]本发明采用的技术方案是:一种实现智能密钥设备双向认证的方法,包括:
[0006]步骤S1:客户端获取用户输入的HTTP地址,根据所述HTTP地址生成请求消息,将所述请求消息发送给系统组件,通过所述系统组件向网络服务器发起网络请求;
[0007]步骤S2:所述客户端监听所述系统组件发起的网络请求,当监听到有网络请求发起时,截获所述网络请求,判断网络请求中的第一数据是否为预设字符串,如果是,则获取所述网络请求中的第二数据,执行步骤S3,否则返回不截获响应;
[0008]步骤S3:所述客户端从智能密钥设备中获取智能密钥设备证书并显示,等待接收用户对所述智能密钥设备证书的选择;
[0009]步骤S4:所述客户端接收用户选择的证书,创建私钥对象,对所述私钥对象进行构造,将私钥对象中的私钥加密函数构造为使用所述智能密钥设备进行签名;
[0010]步骤S5:所述客户端对所述私钥对象的结构成员进行初始化,将所述私钥对象的模数和公开幂初始化为所述用户选择的证书公钥的模数和公开幂,将所述私钥对象的私钥加密函数初始化为所述用户选择的证书的私钥加密函数;
[0011]步骤S6:所述客户端创建SSL连接句柄,根据所述SSL连接句柄,注册所述用户选择的证书和所述私钥对象,将注册后的证书作为客户端证书,将注册后的私钥对象作为客户端私钥对象;
[0012]当创建连接函数被调用时,执行以下操作:
[0013]步骤Al:所述客户端根据获取到的所述网络请求中的第二数据,创建客户端与服务器的连接;
[0014]步骤A2:所述客户端向服务器发送服务器证书请求,接收服务器返回的第一数据包,对所述第一数据包中的服务器证书进行验证,如果验证成功,则执行步骤A3,否则返回
错误信息;
[0015]步骤A3:所述客户端根据客户端证书的模数和公开幂和客户端证书私钥对象的模数和公开幂的对应关系,查找所述客户端证书私钥对象,根据预先对私钥加密函数的构造,使用所述智能密钥设备对第一数据包的待签名数据进行签名,得到签名结果;
[0016]步骤A4:所述客户端根据所述第一数据包中的获取客户端证书请求,向所述服务器发送包含所述客户端证书和所述签名结果的第二数据包,接收服务器对所述第二数据包处理后返回的结果,当所述结果为成功时,成功创建SSL双向认证。
[0017]所述步骤S3中,所述客户端从智能密钥设备中获取智能密钥设备证书,具体为:
[0018]步骤B1:所述客户端为智能密钥设备会话句柄分配会话句柄缓冲区,并获取所述会话句柄缓冲区的首地址,打开会话,将会话句柄保存在所述会话句柄缓冲区中;
[0019]步骤B2:所述客户端获取智能密钥设备证书句柄,根据获取到的证书句柄查找智能密钥设备证书,并将查找到的智能密钥设备证书保存;
[0020]步骤B3:所述客户端结束查找智能密钥设备证书。
[0021]所述步骤B2具体为:
[0022]步骤B2-1:所述客户端填充证书模板;
[0023]步骤B2-2:所述客户端从所述会话句柄缓冲区中获取会话句柄,根据所述会话句柄和所述证书模板,获取智能密钥设备证书句柄,根据所述证书句柄查找智能密钥设备证书。
[0024]所述步骤B2-2具体为:
[0025]步骤B2-2-2-1:所述客户端从所述会话句柄缓冲区中获取会话句柄,根据所述会话句柄和所述证书模板,设置查找证书句柄;
[0026]步骤B2-2-2-2:所述客户端根据预先约定的证书句柄的结构大小,为证书句柄分配证书句柄缓冲区,并获取所述证书句柄缓冲区的首地址;
[0027]步骤B2-2-2-3:所述客户端根据所述会话句柄,查找智能密钥设备证书句柄,判断是否查找到证书句柄,如果是,则将查找到的证书句柄存入所述证书句柄缓冲区中,然后执行步骤B2-2-2-4,否则执行步骤B3 ;
[0028]步骤B2-2-2-4:所述客户端根据预先约定的证书的结构大小,为查找的智能密钥设备证书分配证书缓冲区,并填充证书返回结果模板;
[0029]步骤B2-2-2-5:所述客户端根据所述会话句柄、所述证书句柄和所述证书返回结果模板,获取智能密钥设备证书的值和智能密钥设备证书的长度,并将智能密钥设备证书的值保存在所述证书缓冲区中,返回执行步骤B2-2-2-2。
[0030]所述步骤S4中,所述对所述私钥对象进行构造,具体为:
[0031]步骤Cl:所述客户端预先约定为私钥对象的模数和公开幂转换的字符串分配缓冲区,然后将私钥对象的模数和公开幂转换为预设类型;
[0032]步骤C2:所述客户端根据得到的模数和公开幂所在转换字符串缓冲区的首地址及所述转换字符串缓冲区的长度,查找私钥句柄;
[0033]步骤C3:所述客户端预先约定设置私钥句柄和签名算法;
[0034]步骤C4:所述客户端预先约定当调用签名函数时,使用智能密钥设备进行签名,获取签名结果及签名结果长度;
[0035]步骤C5:所述客户端将所述签名结果长度返回。
[0036]所述步骤C2中,所述查找私钥句柄,具体为:
[0037]步骤C2-1:所述客户端填充私钥模板;
[0038]步骤C2-2:所述客户端从所述会话句柄缓冲区中获取会话句柄,根据所述会话句柄和所述私钥模板,查找私钥句柄。
[0039]所述步骤C2-2,具体为:
[0040]步骤C2-2-1:所述客户端从所述会话句柄缓冲区中获取会话句柄,根据所述会话句柄和所述私钥模板,设置查找私钥句柄;
[0041]步骤C2-2-2:所述客户端根据预先约定的私钥句柄的结构大小,为私钥句柄分配私钥句柄缓冲区,并获取所述私钥句柄缓冲区的首地址;
[0042]步骤C2-2-3:所述客户端根据所述会话句柄,查找私钥句柄,判断是否查找到私钥句柄,如果是,则将查找到的证书句柄存入所述证书句柄缓冲区中,执行步骤C2-2-4,否则执行步骤C5 ;
[0043]步骤C2-2-4:所述客户端结束查找私钥句柄。
[0044]所述步骤S5中,所述客户端对所述私钥对象的结构成员进行初始化,具体为:所述客户端将私钥对象的第一结构成员设置为不需要检测,对私钥对象的第二结构成员进行赋值,将所述私钥对象的模数和公开幂初始化为所述用户选择的证书公钥的模数和公开幂,将所述私钥对象的私钥加密函数初始化为所述用户选择的证书的私钥加密函数。
[0045]所述步骤S6中,所述注册所述用户选择的证书,具体为:
[0046]步骤Dl:所述客户端创建SSL客户端安全传输协议;
[0047]步骤D2:所述客户端将已创建的所述SSL客户端安全传输协议传递给OpenSSL接口,创建SSL连接句柄;
[0048]步骤D3:所述客户端根据已创建的所述SSL连接句柄,注册用户选择的证书,将注册后的证书作为客户端证书。
[0049]所述网络请求中的第二数据包括服务器地址和端口号。
[0050]所述步骤S6之后还包括:
[0051]步骤El:所述客户端根据设置的CA证书的文件名称和文件路径,注册CA证书;
[0052]步骤E2:所述客户端构造验证服务器证书回调函数,注册所述验证服务器证书回调函数。
[0053]所述步骤A2中,所述对所述第一数据包中的服务器证书进行验证,具体为:
[0054]步骤Fl:所述客户端使用所述CA证书对所述第一数据包中的服务器证书进行验证,判断验证是否成功,如果是,则执行步骤F3,否则执行步骤F2 ;
[0055]步骤F2:所述客户端将所述服务器证书传递给所述验证服务器证书回调函数中,判断是否能够验证成功,如果是,则执行步骤A3,否则返回错误信息。
[0056]所述步骤A3中,所述客户端根据客户端证书的模数和公开幂和客户端证书私钥对象的模数和公开幂的对应关系,查找所述客户端证书私钥对象,具体为:根据客户端证书的模数和公开幂可知用户选择的证书的模数和公开幂,根据所述客户端对所述私钥对象的模数和公开幂进行初始化时,将所述私钥对象的模数和公开幂初始化为所述用户选择的证书的模数和公开幂,查找到私钥对象,根据所述私钥对象可知客户端证书私钥对象。
[0057]所述步骤A3中,根据预先对私钥加密函数的构造,使用所述智能密钥设备对第一数据包的待签名数据进行签名,得到签名结果,具体为:
[0058]步骤Gl:所述客户端为客户端证书私钥对象的模数和公开幂转换后得到的字符串分配转换字符缓冲区,将客户端证书私钥对象的模数和公开幂转换为预设类型的字符串;
[0059]步骤G2:所述客户端根据得到的模数和公开幂所在转换字符串缓冲区的首地址及所述转换字符串缓冲区的长度,查找私钥句柄;
[0060]步骤G3:所述客户端设置私钥句柄和签名算法;
[0061]步骤G4:所述客户端调用所述签名函数,使用智能密钥设备对第一数据包的待签名数据进行签名,得到签名结果。
[0062]本发明取得的有益效果是:通过本发明的技术方案,在移动设备中,实现使用智能密钥设备进行SSL双向认证。
【专利附图】
【附图说明】
[0063]为了更清楚的说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单的介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0064]图1是本发明实施例1中步骤104-2-2的具体细化图;
[0065]图2是本发明实施例1的步骤105中构造私钥加密函数的实现过程的具体细化图;
[0066]图3是本发明实施例1的步骤105-2-2的具体细化图;
[0067]图4是本发明实施例1中当创建连接函数被调用时,执行的具体操作细化图。
【具体实施方式】
[0068]下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0069]实施例1
[0070]本发明实施例1提供了一种实现智能密钥设备双向认证的方法,包括:预先在客户端中,将客户端与智能密钥设备的通信方式写入PKCS#11库中,其中,客户端与智能密钥设备的通信方式,具体为:客户端将通信数据按照预设格式进行编码,通过移动平台接口传输给智能密钥设备,智能密钥设备对接收到的数据进行解密,得到原始通信数据;智能密钥设备将通信数据进行编码,通过移动平台接口传输给客户端,客户端对接收到的数据进行解密,得到原始通信数据;
[0071]步骤101:客户端获取用户输入的HTTP地址,根据所述HTTP地址生成请求消息,将该请求消息发送给系统组件,通过该系统组件向网站服务器发起网络请求;[0072]具体的,客户端获取用户输入的HTTP地址,将该HTTP地址作为请求消息中的URL字符串,调用系统组件,向网站服务器发起网络请求;
[0073]其中,系统组件为nWebView,请求消息为NSURLRequest对象的实例,包括URL字符串;
[0074]步骤102:客户端监听系统组件发起的网络请求,当监听到有网络请求发起时,截获所述网络请求,获取所述网络请求中的第一数据,判断所述第一数据是否为预设字符串,如果是,则执行步骤103,否则返回不截获的响应;
[0075]所述预设字符串为https ;
[0076]其中,所述网络请求为URL字符串,例如:https://192.168.12.39:443/ ;
[0077]步骤103:客户端获取所述网络请求中第二数据;
[0078]所述第二数据为服务器地址和端口号;
[0079]本实施例中,所述网络请求为:https://192.168.12.39:443/,其中,192.168.12.39为服务器地址,443为端口号;
[0080]步骤104:客户端从智能密钥设备中获取智能密钥设备证书并显示,等待接收用户对所述智能密钥设备证书的选择;
[0081]本实施例中,优选的,采用UIAlertView组件将查找到的智能密钥设备证书显示出来,供用户选择;
[0082]本实施例中,所述从智能密钥设备中查找智能密钥设备证书,具体为:
[0083]步骤104-1:客户端为智能密钥设备会话句柄分配会话句柄缓冲区,并获取所述会话句柄缓冲区的首地址,打开会话,将会话句柄保存在所述会话句柄缓冲区中;
[0084]本实施例中,步骤104-1具体为:
[0085]I)客户端为智能密钥设备会话句柄分配会话句柄缓冲区;
[0086]具体为:通过调用CK_SESSION_HANDLE hSession=0;为会话句柄分配会话句柄缓冲区;
[0087]2)客户端获取所述会话句柄缓冲区的首地址;
[0088]具体为:通过调用CK_SESS10N HANDLE_PTR phSession=&hSession,获取所述会话句柄缓冲区的首地址;
[0089]3)客户端打开会话,将会话句柄保存在所述会话句柄缓冲区中;
[0090]具体为:通过调用PKCS#11 接 口函数 CK_RV C_0penSession (CK_SL0T_IDslotID,CK_FLAGS flags, CK_V0ID_PTR pApplication,CK_N0TIFY Notify, CK_SESS10NHANDLE_PTR phSession);打开会话,其中,phSession为获取到的所述会话句柄缓冲区的首地址,将会话句柄保存在所述会话句柄缓冲区中,slotID为智能密钥设备在PKCS#11中的唯一标识,其余参数的值均为0 ;
[0091]本实施例中,以下涉及到会话句柄的操作,会话句柄均为从所述会话句柄缓冲区中获取到的;
[0092]步骤104-2:客户端获取智能密钥设备证书句柄,根据获取到的证书句柄从智能密钥设备中获取智能密钥设备证书;
[0093]在本实施例中,所述获取智能密钥设备证书句柄,具体包括:
[0094]步骤104-2-1:客户端填充证书模板;[0095]I)客户端根据要填充的模板需求,指明要填充的模板为证书模板;
[0096]具体为:通过调用CK_OBJECT_CLASS dataClass=CKO_CERTIFICATE;为 dataClass赋值,指明要填充的模板为证书模板;
[0097]2)客户端填充证书模板;
[0098]具体为:通过调用CK_AITRIBUTE pTemplate [] = {{CKA_CLASS, &dataClass, sizeof(dataClass)}};填充证书模板;
[0099]步骤104-2-2:客户端根据所述会话句柄和所述证书模板,查找智能密钥设备证书句柄;
[0100]参见图1,所述根据所述会话句柄和所述证书模板,查找智能密钥设备中的证书句柄,具体为:
[0101]步骤104-2-2-1:客户端根据所述会话句柄和所述证书模板,设置查找证书句柄;
[0102]本实施例中,设置查找证书句柄,具体为:通过调用CK_RV C_FindObjectsInit(CK_SESSION_HANDLE hSession, CK_ATTRIBUTE_PTR pTemplate, CK_UL0NGulCount);设置查找证书句柄;其中,hSession为所述智能密钥设备会话句柄;pTemplate为所述证书模板,ulCount为pTemplate所指区域CK_ATTRIBUTE结构体的个数,本实施例中,得到的ulCount的值为I ;
[0103]步骤104-2-2-2:客户端根据预先约定的证书句柄的结构大小,为证书句柄分配证书句柄缓冲区,并获取所述证书句柄缓冲区的首地址;
[0104]本实施例中,步骤104-2-2-2具体为:
[0105]I)为证书句柄分配证书句柄缓冲区;
[0106]具体为:通过调用CK_OBJECT_HANDLE hOb ject=0,为证书句柄分配证书句柄缓冲区;
[0107]2)获取所述证书句柄缓冲区的首地址;
[0108]具体为:通过调用CK_SESS10N HANDLE_PTR phOb ject=&h0b ject;获取所述证书句柄缓冲区的首地址;
[0109]步骤104-2-2-3:客户端根据所述会话句柄,查找智能密钥设备证书句柄,判断是否查找到证书句柄,如果是,则将查找到的证书句柄存入所述证书句柄缓冲区中,然后执行步骤104-2-2-4,否则执行步骤104-3 ;
[0110]本实施例中,查找智能密钥设备中的证书句柄,并将查找到的证书句柄保存在所述证书句柄缓冲区中,具体为:
[0111]通过调用CK_RV C_Find0b jects (CK_SESS10N_HANDLE hSession, CK_0B JECT_HANDLE_PTR phObject, CK_UL0NG ulMaxObject Count, CK_UL0NG_PTR pulObjectCount);查找智能密钥设备中的证书句柄,其中,hSession为所述会话句柄,phObject为分配的证书句柄缓冲区的首地址,ulMaxOb jectCount为获取证书句柄的最大个数,pulOb jectCount为实际获取到的证书句柄的个数;
[0112]步骤104-2-2-4:客户端根据预先约定的证书的结构大小,为查找的智能密钥设备证书分配证书缓冲区,并填充证书返回结果模板;
[0113]本实施例中,步骤104-2-2-4具体为:
[0114]I)为查找的证书分配证书缓冲区;[0115]具体为:根据预先约定的证书的结构大小CK_UL0NG valueLen=4096;通过调用CK_BYTE value[4096] = {0};为查找的证书分配证书缓冲区;
[0116]2)填充证书返回结果模板;
[0117]具体为:通过调用CK_ATTRIBUTE pTemplate [] = {{CKA_VALUE, value, valueLen}};填充证书返回结果模板pTemplate ;
[0118]步骤104-2-2-5:客户端根据所述会话句柄、所述证书句柄和所述证书返回结果模板,获取智能密钥设备证书的值和智能密钥设备证书的长度,并将智能密钥设备证书的值保存在所述证书缓冲区中,返回执行步骤104-2-2-2 ;
[0119]本实施例中,获取智能密钥设备证书的值和智能密钥设备证书的长度,并将智能密钥设备证书的值保存在所述证书缓冲区中,具体为:
[0120]通过调用CK_RV C_GetAttributeValue(CK_SESSION_HANDLE hSession, CK_0BJECT_HANDLE hObject, CK_ATTRIBUTE_PTR pTemplate, CK_UL0NG ulCount);获取智能密钥设备证书的值和智能密钥设备证书的长度,其中,hSession为所述会话句柄,hObject为所述证书句柄,pTemplate为智能密钥设备证书返回结果模板首地址,根据PKCS#11标准,可知value为智能密钥设备证书所在缓冲区的首地址,valueLen为智能密钥设备证书的长度;
[0121]步骤104-3:客户端结束查找证书;
[0122]本实施例中,所述结束查找智能密钥设备中的证书,具体为:通过调用C_FindObjectsFinal (hsession);结束查找智能密钥设备中的证书;
[0123]步骤105:客户端接收用户选择的证书,创建私钥对象,对所述私钥对象进行构造,将私钥对象中的私钥加密函数构造为使用所述智能密钥设备进行签名;
[0124]本实施例中,所述接收用户选择的证书,具体为:
[0125]I)为用户选择的证书的首地址及用户选择的证书的长度分配缓冲区;
[0126]具体为:通过调用CK_UL0NG ValueLen=O为用户选择的证书长度分配缓冲区;通过调用CK_BYTE*value=NULL;为用户选择的证书首地址分配缓冲区;
[0127]2)获取用户选择的证书的首地址及用户选择的证书的长度;
[0128]具体为:通过调用valueLen=ulValueLen;获取用户选择的证书的长度;通过调用value=pValue;获取用户选择的证书的首地址;
[0129]本实施例中,所述创建私钥对象,具体为:客户端根据预先约定的大小分配缓冲区;具体地,根据预先约定的私钥对象的大小分配缓冲区:RSA private= {0};
[0130]本实施例中,所述私钥加密函数为int cert_rsa_priv_enc (int flen, constunsigned char*from, unsigned char*to, RSA*rsa, int padding);
[0131]参见图2,对私钥对象中的私钥加密函数进行构造的实现过程为:
[0132]步骤105-1:客户端预先约定为私钥加密函数的n和e转换的字符串分配转换字符串缓冲区,然后将私钥加密函数的n和e转换为预设类型;
[0133]其中,n为模数,e为公开幂;优选的,所述预设类型为char*类型;
[0134]本实施例中,步骤105-1具体为:
[0135]I)为私钥加密函数的n和e转换后的字符串分配转换字符串缓冲区;
[0136]具体为:根据unsigned char pModulus [4096] = {0};和 unsigned charpExponent[4096] = {0};为私钥加密函数的n和e转换后的字符串分配转换字符串缓冲区;
[0137]2)将私钥加密函数的n和e转换为预设类型的字符串,并将转换结果保存在所述转换字符串缓冲区中;
[0138]具体为:通过调用BN_bn2bin (rsa_>e, pExponent);和 BN_bn2bin (rsa->n, pModulus);将私钥加密函数的n和e转换为char*类型,并将转换结果保存在所述转换字符串缓冲区中;得到的n和e对应的字符串的长度为unsignedlong ulModulus=BN_num_bytes(rsa->n);和 unsigned long ulExpLength=BN_num_bytes (rsa->e);
[0139]步骤105-2:客户端根据得到的n和e所在转换字符串缓冲区的首地址及所述转换字符串缓冲区的长度,查找私钥句柄;
[0140]在本实施例中,所述查找私钥句柄,具体包括:
[0141]步骤105_2_1:填充私钥模板;
[0142]本实施例中,步骤105-2-1具体为:
[0143]I)根据要填充的模板需求,指明要填充的模板为私钥模板;
[0144]具体为:通过调用CK_OBJECT_CLASS dataClass=CKO_PRIVATE;为 dataClass 赋值,指明要填充的模板为私钥模板;
[0145]2)填充私钥模板;
[0146]具体为:通过调用CK_AITRIBUTE pTemplate [] = {{CKA_CLASS, &dataClass, sizeof(dataClass)}};填充私钥模板;
[0147]步骤105-2-2:客户端根据所述会话句柄和所述私钥模板,查找私钥句柄;
[0148]参见图3,本实施例中,步骤105-2-2具体为:
[0149]步骤105-2-2-1:客户端根据所述会话句柄和所述私钥模板,设置查找私钥句柄;
[0150]本实施例中,设置查找私钥句柄,具体为:通过调用CK_RV C_FindObjectsInit(CK_SESS10N_HANDLE hSession, CK_ATTRIBUTE_PTR pTemplate, CK_UL0NGulCount);设置查找私钥句柄;其中,hSession为所述智能密钥设备会话句柄;pTemplate为所述私钥模板,ulCount为pTemplate所指区域CK_ATTRIBUTE结构体的个数,本实施例中,得到的ulCount的值为I ;
[0151]步骤105-2-2-2:客户端根据预先约定的私钥句柄的结构大小,为私钥句柄分配私钥句柄缓冲区,并获取所述私钥句柄缓冲区的首地址;
[0152]本实施例中,步骤105-2-2-2具体为:
[0153]I)为私钥句柄分配私钥句柄缓冲区;
[0154]具体为:通过调用CK_0BJECT_HANDLE priHandle=0,为私钥句柄分配缓冲区;
[0155]2)获取所述私钥句柄缓冲区的首地址;
[0156]具体为:通过调用CK_SESS10N HANDLE_PTR phOb ject=&priHandle;获取所述私钥句柄缓冲区的首地址;
[0157]步骤105-2-2-3:客户端根据所述会话句柄,查找私钥句柄,判断是否查找到私钥句柄,如果是,则将查找到的证书句柄存入所述证书句柄缓冲区中,执行步骤105-2-2-4,否则执行步骤105-5 ;
[0158]本实施例中,查找私钥句柄,并将查找到的私钥句柄保存在所述私钥句柄缓冲区中,具体为:
[0159]通过调用CK_RV C_Find0b jects (CK_SESSION_HANDLE hSession, CK_0B JECT_HANDLE_PTR phObject, CK_UL0NG ulMaxObject Count, CK_UL0NG_P TR pulObjectCount);查找私钥句柄,其中,hSession为所述会话句柄,phObject为分配的私钥句柄缓冲区的首地址,即私钥句柄保存在priHandle中,ulMaxOb jectCount为获取私钥句柄的最大个数,pulOb jectCount为实际获取到的私钥句柄的个数;
[0160]步骤105-2-2-4:客户端结束查找私钥句柄;
[0161]本实施例中,结束查找私钥句柄,具体为:通过调用C_Find0b jectsFinal(hsession);结束查找私钥句柄;
[0162]步骤105-3:客户端预先约定设置私钥句柄和签名算法;
[0163]本实施例中,步骤105-3具体为:
[0164]I)指定签名算法;
[0165]具体为:通过调用CK_MECHANISM mechanism= {CKM_RSA_PKCS, NULL_PTR, 0};指定签名算法为CKM_RSA_PKCS ;
[0166]2)设置签名算法;
[0167]具体为:通过调用C_SignInit (hSession, &mechanism, priHandle);设置签名算法,其中,hSession为会话句柄,mechanism为指定的签名算法,priHandle为私钥句柄;
[0168]步骤105-4:客户端预先约定调用签名函数,使用智能密钥设备进行签名,获取签名结果及签名结果长度;
[0169]所述签名函数为PKCS#11接口签名函数C_Sign ;
[0170]本实施例中,步骤105-4具体为:
[0171]步骤105-4-1:客户端根据预先约定的PKCS#11数据结构的大小为返回长度分配缓返回长度缓冲区,并获取所述返回长度缓冲区的首地址;
[0172]本实施例中,步骤105-4-1具体为:
[0173]I)为返回长度分配返回长度缓冲区;
[0174]具体为:根据CK_UL0NG ulSignSignatureLen=4096;为返回长度分配返回长度缓冲区;
[0175]2)获取所述返回长度缓冲区的首地址;
[0176]具体为:通过调用pulSignatureLen=&ulSignSignatureLen;获取所述返回长度缓冲区的首地址pulSignatureLen ;
[0177]步骤105-4-2:调用PKCS#11接口签名函数C_Sign,获取签名结果及签名结果的长度;
[0178]本实施例中,获取签名结果的长度pulSignatureLen,具体为:
[0179]通过调用CK_RV C_Sign(CK_SESS10N_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ulDataLen, CK_BYTE_PTR pSignature, CK_UL0NG_PTR pulSignatureLen);获取签名结果的长度pulSignatureLen,其中CK_UL0NG ulSignatureLen为返回的签名结果的长度,即为cert_rsa_priv_enc的返回值;pSignature为返回的签名结果,其中,在PKCS#11接口中,参数hSession为已打开的会话,pData为cert_rsa_priv_enc中的参数from,ulDataLen 为 flen, pSignature 为 cert_rsa_priv_enc 参数 to ;[0180]其中,在PKCS#11接口中,参数hSession为已打开的会话,pData为cert_rsa_priv_enc 中的参数 from, ulDataLen 为 flen, pSignature 为 cert_rsa_priv_enc 参数 to ;
[0181]步骤105-5:客户端将所述签名结果的长度返回;
[0182]本实施例中,如果没有查找到私钥句柄,则返回的签名结果的长度为0 ;
[0183]步骤106:客户端对所述私钥对象的结构成员进行初始化,将所述私钥对象的n和e初始化为用户选择的证书公钥的n和e,将所述私钥对象的私钥加密函数初始化为用户选择的证书的私钥加密函数;
[0184]具体为,根据OpenSSL在SSL双向认证过程中,对私钥对象的使用,对私钥对象的结构成员进行初始化;
[0185]根据预先约定的OpenSSL数据对象RSA_METH0D的大小分配缓冲区:RSA_METH0Drsa_pri={0};
[0186]本实施例中,私钥对象的结构成员包括:BIGNUM*n; BIGNUM*e; const RSA_METH0D*meth;int flags;;
[0187]其中*meth 中包括成员 int (*rsa_priv_enc)(int flen, const unsignedchar*from, unsigned char*to, RSA*rsa, int padding);和模幕函数 int (*bn_mod_exp)(BIGNUM*r, const BIGNUM*a, const BIGNUM*p, const BIGNUM*m, BN_CTX*ctx, BN_M0NT_CTX*m_ctx);
[0188]本实施例中,所述对私钥对象的结构成员进行初始化,具体为:
[0189]步骤106-1:将私钥对象的第一结构成员flags设置为不需要检测;
[0190]本实施例中,将私钥对象的第一结构成员flags设置为不需要检测,具体为:
[0191 ]通过调用 rsa_pr1.flags=RSA_METH0D_FLAG_N0_CHECK;将 flags 设置为不需要检测,其中,RSA_METH0D_FLAG_N0_CHECK为openSSL的宏定义,表示flags不需要检测;
[0192]步骤106-2:对私钥对象的第二结构成员meth进行赋值;
[0193]本实施例中,对私钥对象的第二结构成员meth进行赋值,具体为:
[0194]通过调用private.meth=&rsa_pri ;为私钥对象的第二结构成员meth进行赋值,用于修改在SSL认证的过程中签名算法和模拟函数;
[0195]步骤106-3:设置私钥对象的结构成员n与e ;
[0196]本实施例中,所述设置私钥对象的结构成员n与e,具体为:
[0197]步骤106-3-1:获取预设类型的证书;
[0198]本实施例中,优选的,预设类型的证书为X509类型的证书;
[0199]所述获取预设类型的证书,具体为:将所述证书缓冲区的首地址和证书长度,传递给OpenSSL接口,将证书转变为X509类型的证书,具体为:
[0200]通过调用X509*x509=d2i_X509 (NULL, (const unsigned char**) &value, (long)valueLen);将所述证书缓冲区的首地址和证书长度,传递给OpenSSL接口,将证书转变为X509类型的证书,其中value为客户端证书所在缓冲区的首地址,valueLen为客户端证书的长度;
[0201]步骤106-3-2:获取RSA*类型的公钥pubKey ;
[0202]在本实施例中,获取RSA*类型的公钥pubKey,具体为:将获取的x509格式中的证书公钥数据的首地址以及x509格式中证书公钥数据长度,传递给OpenSSL接口,得到RSA*类型的公钥pubKey,具体为:
[0203]通过调用RSA*pubKey = d2i_RSAPublic Key (NULL, (constunsignedchar林)&x509->cert_info->key->public_key->data,x509_>cert_info->key->public_key->length);将获取的x509格式中的证书公钥数据的首地址以及x509格式中证书公钥数据长度,传递给OpenSSL接口,得到RSA*类型的公钥pubKey ;
[0204]步骤106-3-3:将证书公钥的n和e赋给私钥对象的n和e ;
[0205]在本实施例中,将证书公钥的n和e赋给私钥对象,具体为:通过调用private.n=BN_dup (pubKey->n);和 private.e=BN_dup (pubKey->e);将证书公钥的 n 和 e 赋给私钥对象的n和e ;
[0206]步骤106-4:对私钥对象的私钥加密函数进行初始化;
[0207]在本实施例中,对私钥加密函数进行初始化,具体为:通过调用rsa_pr1.rsa_priv_enc=cert_rsa_priv_enc;对私钥加密函数进行初始化,使得在使用私钥rsa_pri加密时,启用 cert_rsa_priv_enc 函数:
[0208]步骤107:客户端创建SSL客户端安全传输协议,根据所述SSL客户端安全传输协议,创建SSL连接句柄,根据所述SSL连接句柄,注册所述用户选择的证书和所述私钥对象,将所述用户选择的证书注册为客户端证书,将所述私钥对象注册为客户端私钥对象;
[0209]本实施例中,所述注册客户端证书,具体为:
[0210]步骤102-1:客户端创建SSL客户端安全传输协议;
[0211]优选的,在本实施例中,使用的安全传输协议为TLSvl和SSLv3,用于在两个通道应用程序之间提供保密性和数据完整性;除此之外,安全传输协议还包括:SSLv2、SSLv3、TLSv1.0、TLSv1.1 或 TLSvl.2 ;
[0212]本实施例中,步骤102-1具体为:
[0213]I)根据预先约定的SSL协议方法的数据结构SSLjnethod的大小分配传输协议缓冲区;
[0214]具体为:根据SSL_method sslMethod= {0};分配传输协议缓冲区;
[0215]2)创建SSL客户端安全传输协议;
[0216]具体为:通过调用sslMethod=TLSvl_client_method();创建SSL客户端使用协议;
[0217]步骤102-2:客户端将已创建的SSL客户端安全传输协议传递给openSSL接口,创建SSL连接句柄;
[0218]本实施例中,将已创建的SSL客户端安全传输协议sslMethod传递给openSSL接口,创建 openSSL 连接句柄 ctx,具体为:调用 SSL_CTX*ctx=SSL_CTX_new (sslMethod);其中ctx为openSSL连接句柄的首地址;
[0219]步骤102-3:客户端根据创建的所述SSL连接句柄,注册客户端证书;
[0220]本实施例中,注册客户端证书,具体为:通过调用int ret=SSL_CTX_use_certificate_ASNl (ctx, valueLen, value);注册客户端证书,其中,ctx为创建的所述openSSL连接句柄的首地址ctx, value为所述证书缓冲区的首地址,valueLen为客户端证书的长度;
[0221]其中,当ret的值为0时,表示注册客户端证书失败,返回错误信息,当ret的值为非O时,表示注册客户端证书成功;
[0222]在本实施例中,所述将所述私钥对象注册为客户端私钥对象,具体为:将所述SSL连接句柄的首地址ctx和所述私钥句柄缓冲区的首地址prikey传递给OpenSSL接口,具体为:
[0223]通过调用SSL_CTX_use_RSAPrivateKey (ctx, &prikey);将所述私钥对象注册为客户端私钥对象,其中,ctx为所述SSL连接句柄的首地址,prikey为所述私钥对象缓冲区的首地址;
[0224]步骤108:客户端根据设置的CA证书的文件名称和文件路径,注册CA证书,根据注册CA证书函数的返回值判断是否能够注册成功,如果是,则执行步骤109,否则返回错误
信息;
[0225]本实施例中,所述注册信任CA证书,具体为:
[0226]I)设置CA证书的文件名称;
[0227]具体为:通过调用const char*CAfiIe=” CAFile.PEM” ;设置CA证书的文件名称CAfile 为 CAFile.PEM ;
[0228]2 )设置CA证书的文件路径;
[0229]具体为:通过调用const char*CAPath=”/mnt/sdcard/CACert/”;设置 CA 证书的文件路径 CAPath 为 /mnt/sdcard/CACert/ ;
[0230]3)根据CA证书的文件名称和CA证书的文件路径,注册CA证书;
[0231]具体为:通过调用Int SSL_CTX_load_verify_locations (SSL_CTX*ctx, constchar*CAfile, const char*CAPath);注册CA证书,其中ctx为步骤102-2中创建的连接句柄的首地址,CAfile为CA证书的文件名称,CAPath为CA证书的文件路径;
[0232]如果函数返回值为1,则表示注册CA证书成功,如果函数返回值为0,则表示注册信任CA证书失败;
[0233]步骤109:客户端根据已创建的所述SSL连接句柄,构造验证服务器证书回调函数,根据所述SSL连接句柄和已构造的所述验证服务器证书回调函数,注册验证服务器证书回调函数;
[0234]所述注册验证服务器证书回调函数,具体为:
[0235]步骤109-1:构造验证服务器证书的回调函数;
[0236]本实施例中,构造验证服务器证书的回调函数,具体为:通过调用Int verify,callback(X509_ST0RE_CTX*ctx, void*arg);构造验证服务器证书的回调函数,其中,ctx为步骤102-2中创建的SSL连接句柄的首地址,arg用于验证服务器证书是否为信任服务器证书;
[0237]步骤109-2:注册验证服务器证书的回调函数;
[0238]本实施例中,注册验证服务器证书的回调函数,具体为:通过调用SSL_CTX_set_cert_verify_callback(ctx, verify_callback, sslCert);注册验证服务器证书回调函数;其中,ctx为创建的连接句柄的首地址,verify_callback为已构造的验证服务器证书的回调函数,sslCert用于验证服务器证书是否为信任服务器证书;
[0239]当创建连接函数被调用时,如图4所示,执行以下操作:
[0240]步骤S1:客户端根据所述网络请求中的第二数据创建服务器与客户端之间的连接;
[0241]具体为,所述根据所述SSL服务器地址和所述端口号创建服务器与客户端之间的连接,具体为:
[0242]I)设置SSL服务器地址和端口号;
[0243]具体为:通过调用B10_set_connect_hostname (bio, 192.168.12.39:443);设置SSL 服务器地址 192.168.12.39,端口号 443 ;
[0244]2)创建服务器与客户端之间的连接;
[0245]具体为:通过调用B10*bio=B10_new_ssl_connect (ctx);创建服务器与客户端之间的连接;
[0246]步骤S2:客户端向服务器发送服务器证书请求,接收服务器返回的第一数据包;
[0247]本实施例中,所述第一数据包包括:服务器证书、待签名数据和获取客户端证书请求;
[0248]步骤S3:客户端使用CA证书对所述第一数据包中的服务器证书进行验证,判断验证是否成功,如果是,则执行步骤S5,否则执行步骤S4 ;
[0249]步骤S4:客户端将服务器证书传递给所述验证服务器证书的回调函数中,判断是否能够验证成功,如果是,则执行步骤S5,否则返回错误信息;
[0250]步骤S5:客户端根据客户端证书的n、e和私钥对象的n、e的对应关系,查找客户端证书私钥对象;
[0251]具体为:根据客户端证书的模数和公开幂可知用户选择的证书的模数和公开幂,根据所述客户端对所述私钥对象的模数和公开幂进行初始化时,将所述私钥对象的模数和公开幂初始化为所述用户选择的证书的模数和公开幂,查找到私钥对象,根据所述私钥对象可知客户端证书私钥对象;
[0252]本实施例中,根据预先约定的对私钥加密函数的初始化,可知private.meth->rsa_priv_enc=cert_rsa_priv_enc ;
[0253]步骤S6:客户端为客户端证书私钥对象的n和e转换后得到字符串分配转换字符缓冲区,将客户端证书私钥对象的n和e转换为预设类型的字符串;
[0254]所述预设类型的字符串为char*类型的字符串;
[0255]本实施例中,步骤109-6具体为:
[0256]I)为私钥加密函数的参数rsa的n和e转换后的字符串分配转换字符串缓冲区;
[0257]具体为:根据unsigned char pModulus [4096] = {0};和 unsigned charpExponent [4096] = {0};为私钥加密函数的参数rsa的n和e转换后的字符串分配转换字符串缓冲区;
[0258]2)将客户端证书的证书私钥的n和e转换为预设类型的字符串,并将转换结果保存在所述转换字符串缓冲区中;
[0259]具体为:通过调用BN_bn2bin (rsa_>e, pExponent);和 BN_bn2bin(rsa->n, pModulus);将客户端证书的证书私钥的n和e转换为char*类型,并将结果保存在所述转换字符串缓冲区中;得到的n和e对应的字符串的长度为unsignedlong ulModulus=BN_num_bytes (rsa_>n);和 unsigned long ulExpLength=BN_num_bytes (rsa->e);[0260]步骤S7:客户端根据得到的n和e所在转换字符串缓冲区的首地址及所述转换字符串缓冲区的长度,查找私钥句柄;
[0261]在本实施例中,所述查找私钥句柄,具体包括:
[0262]步骤S7-1:填充私钥模板;
[0263]I)根据要填充的模板需求,指明要填充的模板为私钥模板;
[0264]具体为:通过调用CK_OBJECT_CLASS dataClass=CKO_PRIVATE;为 dataClass 赋值,指明要填充的模板为私钥模板;
[0265]2)填充私钥模板;
[0266]具体为:通过调用CK_ATTRIBUTE pTemplate [] = {{CKA_CLASS, &dataClass, sizeof(dataClass)}};填充私钥模板;
[0267]步骤S7-2:根据所述会话句柄和所述私钥模板,查找私钥句柄;
[0268]本实施例中,步骤S7-2具体为:
[0269]步骤S7-2-1:根据所述会话句柄和所述私钥模板,设置查找私钥句柄;
[0270]本实施例中,设置查找私钥句柄,具体为:通过调用CK_RV C_FindObjectsInit(CK_SESSION_HANDLE hSession, CK_ATTRIBUTE_PTR pTemplate, CK_UL0NGulCount);设置查找私钥句柄;其中,hSession为获取的所述智能密钥设备会话句柄;pTemplate为所述私钥模板,ulCount为pTemplate所指区域CK_ATTRIBUTE结构体的个数,本实施例中,得到的ulCount的值为I ;
[0271]步骤S7-2-2:根据预先约定的私钥句柄的结构大小,为私钥句柄分配私钥句柄缓冲区,并获取所述私钥句柄缓冲区的首地址;
[0272]本实施例中,步骤S7-2-2具体为:
[0273]I)为私钥句柄分配私钥句柄缓冲区;
[0274]具体为:通过调用CK_0BJECT_HANDLE priHandle=0,为私钥句柄分配缓冲区;
[0275]2)获取所述私钥句柄缓冲区的首地址;
[0276]具体为:通过调用CK_SESS10N HANDLE_PTR phOb ject=&priHandle;获取所述私钥句柄缓冲区的首地址;
[0277]步骤S7-2-3:根据所述会话句柄,查找私钥句柄,并将查找到的私钥句柄保存在所述私钥句柄缓冲区中;
[0278]本实施例中,查找私钥句柄,并将查找到的私钥句柄保存在所述私钥句柄缓冲区中,具体为:
[0279]通过调用CK_RV C_Find0b jects (CK_SESS10N_HANDLE hSession, CK_0B JECT_HANDLE_PTR phObject, CK_UL0NG ulMaxObject Count, CK_UL0NG_P TR pulObjectCount);查找私钥句柄,其中,hSession为所述会话句柄,phObject为分配的私钥句柄缓冲区的首地址,即私钥句柄保存在priHandle中,ulMaxOb jectCount为获取私钥句柄的最大个数,pulOb jectCount为实际获取到的私钥句柄的个数;
[0280]步骤S7-2-4:结束查找私钥句柄;
[0281 ] 本实施例中,结束查找私钥句柄,具体为:通过调用C_Find0b jectsFinal(hsession);结束查找私钥句柄;
[0282]步骤S8:客户端设置私钥句柄和签名算法;[0283]本实施例中,步骤S8具体为:
[0284]I)指定签名算法;
[0285]具体为:通过调用CK_MECHANISM mechanism= {CKM_RSA_PKCS, NULL_PTR, 0};指定签名算法为CKM_RSA_PKCS ;
[0286]2)设置签名算法;
[0287]具体为:通过调用C_SignInit (hSession, &mechanism, priHandle);设置签名算法,其中,hSession为会话句柄,mechanism为指定的签名算法,priHandle为私钥句柄;
[0288]步骤S9:客户端调用所述签名函数,使用智能密钥设备对第一数据包中的待签名数据进行签名,得到签名结果;
[0289]所述签名函数为PKCS#11接口签名函数C_Sign
[0290]本实施例中,步骤S9具体为:
[0291]步骤S9-1:根据预先约定的PKCS#11数据结构的大小为返回长度分配缓返回长度缓冲区,并获取所述返回长度缓冲区的首地址;
[0292]本实施例中,步骤S9-1具体为:
[0293]I)为返回长度分配返回长度缓冲区;
[0294]具体为:根据CK_UL0NG ulSignSignatureLen=4096;为返回长度分配返回长度缓冲区;
[0295]2)获取所述返回长度缓冲区的首地址;
[0296]具体为:通过调用pulSignatureLen=&ulSignSignatureLen;获取所述返回长度缓冲区的首地址pulSignatureLen ;
[0297]步骤S9-2:调用PKCS#11接口签名函数C_Sign,使用智能密钥设备进行签名,得到签名结果及签名结果的长度;
[0298]本实施例中,获取签名结果的长度pulSignatureLen,具体为:
[0299]通过调用CK_RV C_Sign(CK_SESS10N_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ulDataLen, CK_BYTE_PTR pSignature, CK_UL0NG_PTR pulSignatureLen);获取签名结果的长度pulSignatureLen,其中CK_UL0NG ulSignatureLen为返回的签名结果的长度,即为cert_rsa_priv_enc的返回值;pSignature为返回的签名结果,其中,在PKCS#11接口中,参数hSession为已打开的会话,pData为cert_rsa_priv_enc中的参数from,ulDataLen 为 flen, pSignature 为 cert_rsa_priv_enc 参数 to ;
[0300]步骤SlO:客户端根据第一数据包中的获取客户端证书请求,向服务器返回第二数据包;
[0301]所述第二数据包,包括:客户端证书和所述签名结果;
[0302]步骤Sll:客户端接收服务器对所述第二数据包处理后返回的验证结果,并判断验证结果,当验证结果为成功时,成功建立双向认证。
[0303]以上所述,仅为本发明的【具体实施方式】,但本发明的保护范围并不局限于此,任何熟悉本【技术领域】的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。
【权利要求】
1.一种实现智能密钥设备双向认证的方法,其特征在于,包括: 步骤S1:客户端获取用户输入的HTTP地址,根据所述HTTP地址生成请求消息,将所述请求消息发送给系统组件,通过所述系统组件向网络服务器发起网络请求; 步骤S2:所述客户端监听所述系统组件发起的网络请求,当监听到有网络请求发起时,截获所述网络请求,判断网络请求中的第一数据是否为预设字符串,如果是,则获取所述网络请求中的第二数据,执行步骤S3,否则返回不截获响应; 步骤S3:所述客户端从智能密钥设备中获取智能密钥设备证书并显示,等待接收用户对所述智能密钥设备证书的选择; 步骤S4:所述客户端接收用户选择的证书,创建私钥对象,对所述私钥对象进行构造,将私钥对象中的私钥加密函数构造为使用所述智能密钥设备进行签名; 步骤S5:所述客户端对所述私钥对象的结构成员进行初始化,将所述私钥对象的模数和公开幂初始化为所述用户选择的证书公钥的模数和公开幂,将所述私钥对象的私钥加密函数初始化为所述用户选择的证书的私钥加密函数; 步骤S6:所述客户端创建SSL连接句柄,根据所述SSL连接句柄,注册所述用户选择的证书和所述私钥对象,将注册后的证书作为客户端证书,将注册后的私钥对象作为客户端私钥对象; 当创建连接函数被调用时,执行以下操作: 步骤Al:所述客户端根据获 取到的所述网络请求中的第二数据,创建客户端与服务器的连接; 步骤A2:所述客户端向服务器发送服务器证书请求,接收服务器返回的第一数据包,对所述第一数据包中的服务器证书进行验证,如果验证成功,则执行步骤A3,否则返回错误信息; 步骤A3:所述客户端根据客户端证书的模数和公开幂和客户端证书私钥对象的模数和公开幂的对应关系,查找所述客户端证书私钥对象,根据预先对私钥加密函数的构造,使用所述智能密钥设备对第一数据包的待签名数据进行签名,得到签名结果; 步骤A4:所述客户端根据所述第一数据包中的获取客户端证书请求,向所述服务器发送包含所述客户端证书和所述签名结果的第二数据包,接收服务器对所述第二数据包处理后返回的结果,当所述结果为成功时,成功创建SSL双向认证。
2.根据权利要求1所述的方法,其特征在于,所述步骤S3中,所述客户端从智能密钥设备中获取智能密钥设备证书,具体为: 步骤B1:所述客户端为智能密钥设备会话句柄分配会话句柄缓冲区,并获取所述会话句柄缓冲区的首地址,打开会话,将会话句柄保存在所述会话句柄缓冲区中; 步骤B2:所述客户端获取智能密钥设备证书句柄,根据获取到的证书句柄查找智能密钥设备证书,并将查找到的智能密钥设备证书保存; 步骤B3:所述客户端结束查找智能密钥设备证书。
3.根据权利要求2所述的方法,其特征在于,所述步骤B2具体为: 步骤B2-1:所述客户端填充证书模板; 步骤B2-2:所述客户端从所述会话句柄缓冲区中获取会话句柄,根据所述会话句柄和所述证书模板,获取智能密钥设备证书句柄,根据所述证书句柄查找智能密钥设备证书。
4.根据权利要求3所述的方法,其特征在于,所述步骤B2-2具体为: 步骤B2-2-2-1:所述客户端从所述会话句柄缓冲区中获取会话句柄,根据所述会话句柄和所述证书模板,设置查找证书句柄; 步骤B2-2-2-2:所述客户端根据预先约定的证书句柄的结构大小,为证书句柄分配证书句柄缓冲区,并获取所述证书句柄缓冲区的首地址; 步骤B2-2-2-3:所述客户端根据所述会话句柄,查找智能密钥设备证书句柄,判断是否查找到证书句柄,如果是,则将查找到的证书句柄存入所述证书句柄缓冲区中,然后执行步骤B2-2-2-4,否则执行步骤B3 ; 步骤B2-2-2-4:所述客户端根据预先约定的证书的结构大小,为查找的智能密钥设备证书分配证书缓冲区,并填充证书返回结果模板; 步骤B2-2-2-5:所述客户端根据所述会话句柄、所述证书句柄和所述证书返回结果模板,获取智能密钥设备证书的值和智能密钥设备证书的长度,并将智能密钥设备证书的值保存在所述证书缓冲区中,返回执行步骤B2-2-2-2。
5.根据权利要求1所述的方法,其特征在于,所述步骤S4中,所述对所述私钥对象进行构造,具体为: 步骤Cl:所述客户端 预先约定为私钥对象的模数和公开幂转换的字符串分配缓冲区,然后将私钥对象的模数和公开幂转换为预设类型; 步骤C2:所述客户端根据得到的模数和公开幂所在转换字符串缓冲区的首地址及所述转换字符串缓冲区的长度,查找私钥句柄; 步骤C3:所述客户端预先约定设置私钥句柄和签名算法; 步骤C4:所述客户端预先约定当调用签名函数时,使用智能密钥设备进行签名,获取签名结果及签名结果长度; 步骤C5:所述客户端将所述签名结果长度返回。
6.根据权利要求5所述的方法,其特征在于,所述步骤C2中,所述查找私钥句柄,具体为: 步骤C2-1:所述客户端填充私钥模板; 步骤C2-2:所述客户端从所述会话句柄缓冲区中获取会话句柄,根据所述会话句柄和所述私钥模板,查找私钥句柄。
7.根据权利要求6所述的方法,其特征在于,所述步骤C2-2,具体为: 步骤C2-2-1:所述客户端从所述会话句柄缓冲区中获取会话句柄,根据所述会话句柄和所述私钥模板,设置查找私钥句柄; 步骤C2-2-2:所述客户端根据预先约定的私钥句柄的结构大小,为私钥句柄分配私钥句柄缓冲区,并获取所述私钥句柄缓冲区的首地址; 步骤C2-2-3:所述客户端根据所述会话句柄,查找私钥句柄,判断是否查找到私钥句柄,如果是,则将查找到的证书句柄存入所述证书句柄缓冲区中,执行步骤C2-2-4,否则执行步骤C5 ; 步骤C2-2-4:所述客户端结束查找私钥句柄。
8.根据权利要求7所述的方法,其特征在于,所述步骤S5中,所述客户端对所述私钥对象的结构成员进行初始化,具体为:所述客户端将私钥对象的第一结构成员设置为不需要检测,对私钥对象的第二结构成员进行赋值,将所述私钥对象的模数和公开幂初始化为所述用户选择的证书公钥的模数和公开幂,将所述私钥对象的私钥加密函数初始化为所述用户选择的证书的私钥加密函数。
9.根据权利要求1所述的方法,其特征在于,所述步骤S6中,所述注册所述用户选择的证书,具体为: 步骤Dl:所述客户端创建SSL客户端安全传输协议; 步骤D2:所述客户端将已创建的所述SSL客户端安全传输协议传递给OpenSSL接口,创建SSL连接句柄; 步骤D3:所述客户端根据已创建的所述SSL连接句柄,注册用户选择的证书,将注册后的证书作为客户端证书。
10.根据权利要求1所述的方法,其特征在于,所述网络请求中的第二数据包括服务器地址和端口号。
11.根据权利要求1所述的方法,其特征在于,所述步骤S6之后还包括: 步骤El:所述客户端根据设置的CA证书的文件名称和文件路径,注册CA证书; 步骤E2:所述客户端构造验证服务器证书回调函数,注册所述验证服务器证书回调函数。
12.根据权利要求11所 述的方法,其特征在于,所述步骤A2中,所述对所述第一数据包中的服务器证书进行验证,具体为: 步骤Fl:所述客户端使用所述CA证书对所述第一数据包中的服务器证书进行验证,判断验证是否成功,如果是,则执行步骤F3,否则执行步骤F2 ; 步骤F2:所述客户端将所述服务器证书传递给所述验证服务器证书回调函数中,判断是否能够验证成功,如果是,则执行步骤A3,否则返回错误信息。
13.根据权利要求8所述的方法,其特征在于,所述步骤A3中,所述客户端根据客户端证书的模数和公开幂和客户端证书私钥对象的模数和公开幂的对应关系,查找所述客户端证书私钥对象,具体为:根据客户端证书的模数和公开幂可知用户选择的证书的模数和公开幂,根据所述客户端对所述私钥对象的模数和公开幂进行初始化时,将所述私钥对象的模数和公开幂初始化为所述用户选择的证书的模数和公开幂,查找到私钥对象,根据所述私钥对象可知客户端证书私钥对象。
14.根据权利要求13所述的方法,其特征在于,所述步骤A3中,根据预先对私钥加密函数的构造,使用所述智能密钥设备对第一数据包的待签名数据进行签名,得到签名结果,具体为: 步骤Gl:所述客户端为客户端证书私钥对象的模数和公开幂转换后得到的字符串分配转换字符缓冲区,将客户端证书私钥对象的模数和公开幂转换为预设类型的字符串; 步骤G2:所述客户端根据得到的模数和公开幂所在转换字符串缓冲区的首地址及所述转换字符串缓冲区的长度,查找私钥句柄; 步骤G3:所述客户端设置私钥句柄和签名算法; 步骤G4:所述客户端调用所述签名函数,使用智能密钥设备对第一数据包的待签名数据进行签名,得到签名结果。
【文档编号】H04L9/32GK103457939SQ201310361807
【公开日】2013年12月18日 申请日期:2013年8月19日 优先权日:2013年8月19日
【发明者】陆舟, 于华章 申请人:飞天诚信科技股份有限公司