CN103457939B - 一种实现智能密钥设备双向认证的方法 - Google Patents
一种实现智能密钥设备双向认证的方法 Download PDFInfo
- Publication number
- CN103457939B CN103457939B CN201310361807.3A CN201310361807A CN103457939B CN 103457939 B CN103457939 B CN 103457939B CN 201310361807 A CN201310361807 A CN 201310361807A CN 103457939 B CN103457939 B CN 103457939B
- Authority
- CN
- China
- Prior art keywords
- certificate
- private key
- client
- handle
- buffering area
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Landscapes
- Storage Device Security (AREA)
Abstract
本发明公开了一种实现智能密钥设备双向认证的方法,属于信息安全领域。所述方法包括:当客户端监听到系统组件发起的网络请求时,截获网络请求,客户端从智能密钥设备中获取证书,接收用户选择的证书,创建私钥对象,并对其进行构造和初始化,将用户选择的证书和私钥对象分别注册为客户端证书和客户端私钥对象,当创建连接函数被调用时,客户端请求服务器证书,验证服务器证书通过后,根据客户端证书和客户端证书私钥对象进行签名,将签名结果和客户端证书发给服务器,接收服务器返回的结果,当结果为成功时,成功创建SSL双向认证。采用本发明所述方案能够实现在移动设备中,使用智能密钥设备进行SSL双向认证。
Description
技术领域
本发明涉及信息安全领域,尤其涉及一种实现智能密钥设备双向认证的方法。
背景技术
SSL是SecureSocketLayer的英文缩写,意思是安全套接层协议,指使用公钥和私钥技术组合的安全网络通讯协议。SSL协议是网景公司(Netscape)推出的基于WEB应用的安全协议,SSL协议指定了一种在应用程序协议(如Http、Telenet、NMTP和FTP等)和TCP/IP协议之间提供数据安全性分层的机制,它为TCP/IP连接提供数据加密、服务器认证、消息完整性以及可选的客户机认证,主要用于提高应用程序之间数据的安全性,对传送的数据进行加密和隐藏,确保数据在传送中不被改变,即确保数据的完整性。
发明人在实现本发明的过程中,发现在移动设备中,无法通过原生接口,使用智能密钥设备进行SSL双向认证。
发明内容
本发明的目的是解决现有技术中存在的问题,提供了一种实现智能密钥设备双向认证的方法。
本发明采用的技术方案是:一种实现智能密钥设备双向认证的方法,包括:
步骤S1:客户端获取用户输入的HTTP地址,根据所述HTTP地址生成请求消息,将所述请求消息发送给系统组件,通过所述系统组件向网络服务器发起网络请求;
步骤S2:所述客户端监听所述系统组件发起的网络请求,当监听到有网络请求发起时,截获所述网络请求,判断网络请求中的第一数据是否为预设字符串,如果是,则获取所述网络请求中的第二数据,执行步骤S3,否则返回不截获响应;
步骤S3:所述客户端从智能密钥设备中获取智能密钥设备证书并显示,等待接收用户对所述智能密钥设备证书的选择;
步骤S4:所述客户端接收用户选择的证书,创建私钥对象,对所述私钥对象进行构造,将私钥对象中的私钥加密函数构造为使用所述智能密钥设备进行签名;
步骤S5:所述客户端对所述私钥对象的结构成员进行初始化,将所述私钥对象的模数和公开幂初始化为所述用户选择的证书公钥的模数和公开幂,将所述私钥对象的私钥加密函数初始化为所述用户选择的证书的私钥加密函数;
步骤S6:所述客户端创建SSL连接句柄,根据所述SSL连接句柄,注册所述用户选择的证书和所述私钥对象,将注册后的证书作为客户端证书,将注册后的私钥对象作为客户端私钥对象;
当创建连接函数被调用时,执行以下操作:
步骤A1:所述客户端根据获取到的所述网络请求中的第二数据,创建客户端与服务器的连接;
步骤A2:所述客户端向服务器发送服务器证书请求,接收服务器返回的第一数据包,对所述第一数据包中的服务器证书进行验证,如果验证成功,则执行步骤A3,否则返回错误信息;
步骤A3:所述客户端根据客户端证书的模数和公开幂和客户端证书私钥对象的模数和公开幂的对应关系,查找所述客户端证书私钥对象,根据预先对私钥加密函数的构造,使用所述智能密钥设备对第一数据包的待签名数据进行签名,得到签名结果;
步骤A4:所述客户端根据所述第一数据包中的获取客户端证书请求,向所述服务器发送包含所述客户端证书和所述签名结果的第二数据包,接收服务器对所述第二数据包处理后返回的结果,当所述结果为成功时,成功创建SSL双向认证。
所述步骤S3中,所述客户端从智能密钥设备中获取智能密钥设备证书,具体为:
步骤B1:所述客户端为智能密钥设备会话句柄分配会话句柄缓冲区,并获取所述会话句柄缓冲区的首地址,打开会话,将会话句柄保存在所述会话句柄缓冲区中;
步骤B2:所述客户端获取智能密钥设备证书句柄,根据获取到的证书句柄查找智能密钥设备证书,并将查找到的智能密钥设备证书保存;
步骤B3:所述客户端结束查找智能密钥设备证书。
所述步骤B2具体为:
步骤B2-1:所述客户端填充证书模板;
步骤B2-2:所述客户端从所述会话句柄缓冲区中获取会话句柄,根据所述会话句柄和所述证书模板,获取智能密钥设备证书句柄,根据所述证书句柄查找智能密钥设备证书。
所述步骤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。
所述步骤S4中,所述对所述私钥对象进行构造,具体为:
步骤C1:所述客户端预先约定为私钥对象的模数和公开幂转换的字符串分配缓冲区,然后将私钥对象的模数和公开幂转换为预设类型;
步骤C2:所述客户端根据得到的模数和公开幂所在转换字符串缓冲区的首地址及所述转换字符串缓冲区的长度,查找私钥句柄;
步骤C3:所述客户端预先约定设置私钥句柄和签名算法;
步骤C4:所述客户端预先约定当调用签名函数时,使用智能密钥设备进行签名,获取签名结果及签名结果长度;
步骤C5:所述客户端将所述签名结果长度返回。
所述步骤C2中,所述查找私钥句柄,具体为:
步骤C2-1:所述客户端填充私钥模板;
步骤C2-2:所述客户端从所述会话句柄缓冲区中获取会话句柄,根据所述会话句柄和所述私钥模板,查找私钥句柄。
所述步骤C2-2,具体为:
步骤C2-2-1:所述客户端从所述会话句柄缓冲区中获取会话句柄,根据所述会话句柄和所述私钥模板,设置查找私钥句柄;
步骤C2-2-2:所述客户端根据预先约定的私钥句柄的结构大小,为私钥句柄分配私钥句柄缓冲区,并获取所述私钥句柄缓冲区的首地址;
步骤C2-2-3:所述客户端根据所述会话句柄,查找私钥句柄,判断是否查找到私钥句柄,如果是,则将查找到的证书句柄存入所述证书句柄缓冲区中,执行步骤C2-2-4,否则执行步骤C5;
步骤C2-2-4:所述客户端结束查找私钥句柄。
所述步骤S5中,所述客户端对所述私钥对象的结构成员进行初始化,具体为:所述客户端将私钥对象的第一结构成员设置为不需要检测,对私钥对象的第二结构成员进行赋值,将所述私钥对象的模数和公开幂初始化为所述用户选择的证书公钥的模数和公开幂,将所述私钥对象的私钥加密函数初始化为所述用户选择的证书的私钥加密函数。
所述步骤S6中,所述注册所述用户选择的证书,具体为:
步骤D1:所述客户端创建SSL客户端安全传输协议;
步骤D2:所述客户端将已创建的所述SSL客户端安全传输协议传递给OpenSSL接口,创建SSL连接句柄;
步骤D3:所述客户端根据已创建的所述SSL连接句柄,注册用户选择的证书,将注册后的证书作为客户端证书。
所述网络请求中的第二数据包括服务器地址和端口号。
所述步骤S6之后还包括:
步骤E1:所述客户端根据设置的CA证书的文件名称和文件路径,注册CA证书;
步骤E2:所述客户端构造验证服务器证书回调函数,注册所述验证服务器证书回调函数。
所述步骤A2中,所述对所述第一数据包中的服务器证书进行验证,具体为:
步骤F1:所述客户端使用所述CA证书对所述第一数据包中的服务器证书进行验证,判断验证是否成功,如果是,则执行步骤F3,否则执行步骤F2;
步骤F2:所述客户端将所述服务器证书传递给所述验证服务器证书回调函数中,判断是否能够验证成功,如果是,则执行步骤A3,否则返回错误信息。
所述步骤A3中,所述客户端根据客户端证书的模数和公开幂和客户端证书私钥对象的模数和公开幂的对应关系,查找所述客户端证书私钥对象,具体为:根据客户端证书的模数和公开幂可知用户选择的证书的模数和公开幂,根据所述客户端对所述私钥对象的模数和公开幂进行初始化时,将所述私钥对象的模数和公开幂初始化为所述用户选择的证书的模数和公开幂,查找到私钥对象,根据所述私钥对象可知客户端证书私钥对象。
所述步骤A3中,根据预先对私钥加密函数的构造,使用所述智能密钥设备对第一数据包的待签名数据进行签名,得到签名结果,具体为:
步骤G1:所述客户端为客户端证书私钥对象的模数和公开幂转换后得到的字符串分配转换字符缓冲区,将客户端证书私钥对象的模数和公开幂转换为预设类型的字符串;
步骤G2:所述客户端根据得到的模数和公开幂所在转换字符串缓冲区的首地址及所述转换字符串缓冲区的长度,查找私钥句柄;
步骤G3:所述客户端设置私钥句柄和签名算法;
步骤G4:所述客户端调用所述签名函数,使用智能密钥设备对第一数据包的待签名数据进行签名,得到签名结果。
本发明取得的有益效果是:通过本发明的技术方案,在移动设备中,实现使用智能密钥设备进行SSL双向认证。
附图说明
为了更清楚的说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单的介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例1中步骤104-2-2的具体细化图;
图2是本发明实施例1的步骤105中构造私钥加密函数的实现过程的具体细化图;
图3是本发明实施例1的步骤105-2-2的具体细化图;
图4是本发明实施例1中当创建连接函数被调用时,执行的具体操作细化图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
实施例1
本发明实施例1提供了一种实现智能密钥设备双向认证的方法,包括:预先在客户端中,将客户端与智能密钥设备的通信方式写入PKCS#11库中,其中,客户端与智能密钥设备的通信方式,具体为:客户端将通信数据按照预设格式进行编码,通过移动平台接口传输给智能密钥设备,智能密钥设备对接收到的数据进行解密,得到原始通信数据;智能密钥设备将通信数据进行编码,通过移动平台接口传输给客户端,客户端对接收到的数据进行解密,得到原始通信数据;
步骤101:客户端获取用户输入的HTTP地址,根据所述HTTP地址生成请求消息,将该请求消息发送给系统组件,通过该系统组件向网站服务器发起网络请求;
具体的,客户端获取用户输入的HTTP地址,将该HTTP地址作为请求消息中的URL字符串,调用系统组件,向网站服务器发起网络请求;
其中,系统组件为UIWebView,请求消息为NSURLRequest对象的实例,包括URL字符串;
步骤102:客户端监听系统组件发起的网络请求,当监听到有网络请求发起时,截获所述网络请求,获取所述网络请求中的第一数据,判断所述第一数据是否为预设字符串,如果是,则执行步骤103,否则返回不截获的响应;
所述预设字符串为https;
其中,所述网络请求为URL字符串,例如:https://192.168.12.39:443/;
步骤103:客户端获取所述网络请求中第二数据;
所述第二数据为服务器地址和端口号;
本实施例中,所述网络请求为:https://192.168.12.39:443/,其中,192.168.12.39为服务器地址,443为端口号;
步骤104:客户端从智能密钥设备中获取智能密钥设备证书并显示,等待接收用户对所述智能密钥设备证书的选择;
本实施例中,优选的,采用UIAlertView组件将查找到的智能密钥设备证书显示出来,供用户选择;
本实施例中,所述从智能密钥设备中查找智能密钥设备证书,具体为:
步骤104-1:客户端为智能密钥设备会话句柄分配会话句柄缓冲区,并获取所述会话句柄缓冲区的首地址,打开会话,将会话句柄保存在所述会话句柄缓冲区中;
本实施例中,步骤104-1具体为:
1)客户端为智能密钥设备会话句柄分配会话句柄缓冲区;
具体为:通过调用CK_SESSION_HANDLEhSession=0;为会话句柄分配会话句柄缓冲区;
2)客户端获取所述会话句柄缓冲区的首地址;
具体为:通过调用CK_SESSIONHANDLE_PTRphSession=&hSession,获取所述会话句柄缓冲区的首地址;
3)客户端打开会话,将会话句柄保存在所述会话句柄缓冲区中;
具体为:通过调用PKCS#11接口函数CK_RVC_OpenSession(CK_SLOT_IDslotID,CK_FLAGSflags,CK_VOID_PTRpApplication,CK_NOTIFYNotify,CK_SESSIONHANDLE_PTRphSession);打开会话,其中,phSession为获取到的所述会话句柄缓冲区的首地址,将会话句柄保存在所述会话句柄缓冲区中,slotID为智能密钥设备在PKCS#11中的唯一标识,其余参数的值均为0;
本实施例中,以下涉及到会话句柄的操作,会话句柄均为从所述会话句柄缓冲区中获取到的;
步骤104-2:客户端获取智能密钥设备证书句柄,根据获取到的证书句柄从智能密钥设备中获取智能密钥设备证书;
在本实施例中,所述获取智能密钥设备证书句柄,具体包括:
步骤104-2-1:客户端填充证书模板;
1)客户端根据要填充的模板需求,指明要填充的模板为证书模板;
具体为:通过调用CK_OBJECT_CLASSdataClass=CKO_CERTIFICATE;为dataClass赋值,指明要填充的模板为证书模板;
2)客户端填充证书模板;
具体为:通过调用CK_ATTRIBUTEpTemplate[]={{CKA_CLASS,&dataClass,sizeof(dataClass)}};填充证书模板;
步骤104-2-2:客户端根据所述会话句柄和所述证书模板,查找智能密钥设备证书句柄;
参见图1,所述根据所述会话句柄和所述证书模板,查找智能密钥设备中的证书句柄,具体为:
步骤104-2-2-1:客户端根据所述会话句柄和所述证书模板,设置查找证书句柄;
本实施例中,设置查找证书句柄,具体为:通过调用CK_RVC_FindObjectsInit(CK_SESSION_HANDLEhSession,CK_ATTRIBUTE_PTRpTemplate,CK_ULONGulCount);设置查找证书句柄;其中,hSession为所述智能密钥设备会话句柄;pTemplate为所述证书模板,ulCount为pTemplate所指区域CK_ATTRIBUTE结构体的个数,本实施例中,得到的ulCount的值为1;
步骤104-2-2-2:客户端根据预先约定的证书句柄的结构大小,为证书句柄分配证书句柄缓冲区,并获取所述证书句柄缓冲区的首地址;
本实施例中,步骤104-2-2-2具体为:
1)为证书句柄分配证书句柄缓冲区;
具体为:通过调用CK_OBJECT_HANDLEhObject=0,为证书句柄分配证书句柄缓冲区;
2)获取所述证书句柄缓冲区的首地址;
具体为:通过调用CK_SESSIONHANDLE_PTRphObject=&hObject;获取所述证书句柄缓冲区的首地址;
步骤104-2-2-3:客户端根据所述会话句柄,查找智能密钥设备证书句柄,判断是否查找到证书句柄,如果是,则将查找到的证书句柄存入所述证书句柄缓冲区中,然后执行步骤104-2-2-4,否则执行步骤104-3;
本实施例中,查找智能密钥设备中的证书句柄,并将查找到的证书句柄保存在所述证书句柄缓冲区中,具体为:
通过调用CK_RVC_FindObjects(CK_SESSION_HANDLEhSession,CK_OBJECT_HANDLE_PTRphObject,CK_ULONGulMaxObjectCount,CK_ULONG_PTRpulObjectCount);查找智能密钥设备中的证书句柄,其中,hSession为所述会话句柄,phObject为分配的证书句柄缓冲区的首地址,ulMaxObjectCount为获取证书句柄的最大个数,pulObjectCount为实际获取到的证书句柄的个数;
步骤104-2-2-4:客户端根据预先约定的证书的结构大小,为查找的智能密钥设备证书分配证书缓冲区,并填充证书返回结果模板;
本实施例中,步骤104-2-2-4具体为:
1)为查找的证书分配证书缓冲区;
具体为:根据预先约定的证书的结构大小CK_ULONGvalueLen=4096;通过调用CK_BYTEvalue[4096]={0};为查找的证书分配证书缓冲区;
2)填充证书返回结果模板;
具体为:通过调用CK_ATTRIBUTEpTemplate[]={{CKA_VALUE,value,valueLen}};填充证书返回结果模板pTemplate;
步骤104-2-2-5:客户端根据所述会话句柄、所述证书句柄和所述证书返回结果模板,获取智能密钥设备证书的值和智能密钥设备证书的长度,并将智能密钥设备证书的值保存在所述证书缓冲区中,返回执行步骤104-2-2-2;
本实施例中,获取智能密钥设备证书的值和智能密钥设备证书的长度,并将智能密钥设备证书的值保存在所述证书缓冲区中,具体为:
通过调用CK_RVC_GetAttributeValue(CK_SESSION_HANDLEhSession,CK_OBJECT_HANDLEhObject,CK_ATTRIBUTE_PTRpTemplate,CK_ULONGulCount);获取智能密钥设备证书的值和智能密钥设备证书的长度,其中,hSession为所述会话句柄,hObject为所述证书句柄,pTemplate为智能密钥设备证书返回结果模板首地址,根据PKCS#11标准,可知value为智能密钥设备证书所在缓冲区的首地址,valueLen为智能密钥设备证书的长度;
步骤104-3:客户端结束查找证书;
本实施例中,所述结束查找智能密钥设备中的证书,具体为:通过调用C_FindObjectsFinal(hsession);结束查找智能密钥设备中的证书;
步骤105:客户端接收用户选择的证书,创建私钥对象,对所述私钥对象进行构造,将私钥对象中的私钥加密函数构造为使用所述智能密钥设备进行签名;
本实施例中,所述接收用户选择的证书,具体为:
1)为用户选择的证书的首地址及用户选择的证书的长度分配缓冲区;
具体为:通过调用CK_ULONGvalueLen=0为用户选择的证书长度分配缓冲区;通过调用CK_BYTE*value=NULL;为用户选择的证书首地址分配缓冲区;
2)获取用户选择的证书的首地址及用户选择的证书的长度;
具体为:通过调用valueLen=ulValueLen;获取用户选择的证书的长度;通过调用value=pValue;获取用户选择的证书的首地址;
本实施例中,所述创建私钥对象,具体为:客户端根据预先约定的大小分配缓冲区;具体地,根据预先约定的私钥对象的大小分配缓冲区:RSAprivate={0};
本实施例中,所述私钥加密函数为intcert_rsa_priv_enc(intflen,constunsignedchar*from,unsignedchar*to,RSA*rsa,intpadding);
参见图2,对私钥对象中的私钥加密函数进行构造的实现过程为:
步骤105-1:客户端预先约定为私钥加密函数的n和e转换的字符串分配转换字符串缓冲区,然后将私钥加密函数的n和e转换为预设类型;
其中,n为模数,e为公开幂;优选的,所述预设类型为char*类型;
本实施例中,步骤105-1具体为:
1)为私钥加密函数的n和e转换后的字符串分配转换字符串缓冲区;
具体为:根据unsignedcharpModulus[4096]={0};和unsignedcharpExponent[4096]={0};为私钥加密函数的n和e转换后的字符串分配转换字符串缓冲区;
2)将私钥加密函数的n和e转换为预设类型的字符串,并将转换结果保存在所述转换字符串缓冲区中;
具体为:通过调用BN_bn2bin(rsa->e,pExponent);和BN_bn2bin(rsa->n,pModulus);将私钥加密函数的n和e转换为char*类型,并将转换结果保存在所述转换字符串缓冲区中;得到的n和e对应的字符串的长度为:unsignedlongulModulus=BN_num_bytes(rsa->n);和unsignedlongulExpLength=BN_num_bytes(rsa->e);
步骤105-2:客户端根据得到的n和e所在转换字符串缓冲区的首地址及所述转换字符串缓冲区的长度,查找私钥句柄;
在本实施例中,所述查找私钥句柄,具体包括:
步骤105-2-1:填充私钥模板;
本实施例中,步骤105-2-1具体为:
1)根据要填充的模板需求,指明要填充的模板为私钥模板;
具体为:通过调用CK_OBJECT_CLASSdataClass=CKO_PRIVATE;为dataClass赋值,指明要填充的模板为私钥模板;
2)填充私钥模板;
具体为:通过调用CK_ATTRIBUTEpTemplate[]={{CKA_CLASS,&dataClass,sizeof(dataClass)}};填充私钥模板;
步骤105-2-2:客户端根据所述会话句柄和所述私钥模板,查找私钥句柄;
参见图3,本实施例中,步骤105-2-2具体为:
步骤105-2-2-1:客户端根据所述会话句柄和所述私钥模板,设置查找私钥句柄;
本实施例中,设置查找私钥句柄,具体为:通过调用CK_RVC_FindObjectsInit(CK_SESSION_HANDLEhSession,CK_ATTRIBUTE_PTRpTemplate,CK_ULONGulCount);设置查找私钥句柄;其中,hSession为所述智能密钥设备会话句柄;pTemplate为所述私钥模板,ulCount为pTemplate所指区域CK_ATTRIBUTE结构体的个数,本实施例中,得到的ulCount的值为1;
步骤105-2-2-2:客户端根据预先约定的私钥句柄的结构大小,为私钥句柄分配私钥句柄缓冲区,并获取所述私钥句柄缓冲区的首地址;
本实施例中,步骤105-2-2-2具体为:
1)为私钥句柄分配私钥句柄缓冲区;
具体为:通过调用CK_OBJECT_HANDLEpriHandle=0,为私钥句柄分配缓冲区;
2)获取所述私钥句柄缓冲区的首地址;
具体为:通过调用CK_SESSIONHANDLE_PTRphObject=&priHandle;获取所述私钥句柄缓冲区的首地址;
步骤105-2-2-3:客户端根据所述会话句柄,查找私钥句柄,判断是否查找到私钥句柄,如果是,则将查找到的证书句柄存入所述证书句柄缓冲区中,执行步骤105-2-2-4,否则执行步骤105-5;
本实施例中,查找私钥句柄,并将查找到的私钥句柄保存在所述私钥句柄缓冲区中,具体为:
通过调用CK_RVC_FindObjects(CK_SESSION_HANDLEhSession,CK_OBJECT_HANDLE_PTRphObject,CK_ULONGulMaxObjectCount,CK_ULONG_PTRpulObjectCount);查找私钥句柄,其中,hSession为所述会话句柄,phObject为分配的私钥句柄缓冲区的首地址,即私钥句柄保存在priHandle中,ulMaxObjectCount为获取私钥句柄的最大个数,pulObjectCount为实际获取到的私钥句柄的个数;
步骤105-2-2-4:客户端结束查找私钥句柄;
本实施例中,结束查找私钥句柄,具体为:通过调用C_FindObjectsFinal(hsession);结束查找私钥句柄;
步骤105-3:客户端预先约定设置私钥句柄和签名算法;
本实施例中,步骤105-3具体为:
1)指定签名算法;
具体为:通过调用CK_MECHANISMmechanism={CKM_RSA_PKCS,NULL_PTR,0};指定签名算法为CKM_RSA_PKCS;
2)设置签名算法;
具体为:通过调用C_SignInit(hSession,&mechanism,priHandle);设置签名算法,其中,hSession为会话句柄,mechanism为指定的签名算法,priHandle为私钥句柄;
步骤105-4:客户端预先约定调用签名函数,使用智能密钥设备进行签名,获取签名结果及签名结果长度;
所述签名函数为PKCS#11接口签名函数C_Sign;
本实施例中,步骤105-4具体为:
步骤105-4-1:客户端根据预先约定的PKCS#11数据结构的大小为返回长度分配缓返回长度缓冲区,并获取所述返回长度缓冲区的首地址;
本实施例中,步骤105-4-1具体为:
1)为返回长度分配返回长度缓冲区;
具体为:根据CK_ULONGulSignSignatureLen=4096;为返回长度分配返回长度缓冲区;
2)获取所述返回长度缓冲区的首地址;
具体为:通过调用pulSignatureLen=&ulSignSignatureLen;获取所述返回长度缓冲区的首地址pulSignatureLen;
步骤105-4-2:调用PKCS#11接口签名函数C_Sign,获取签名结果及签名结果的长度;
本实施例中,获取签名结果的长度pulSignatureLen,具体为:
通过调用CK_RVC_Sign(CK_SESSION_HANDLEhSession,CK_BYTE_PTRpData,CK_ULONGulDataLen,CK_BYTE_PTRpSignature,CK_ULONG_PTRpulSignatureLen);获取签名结果的长度pulSignatureLen,其中CK_ULONGulSignatureLen为返回的签名结果的长度,即为cert_rsa_priv_enc的返回值;pSignature为返回的签名结果,其中,在PKCS#11接口中,参数hSession为已打开的会话,pData为cert_rsa_priv_enc中的参数from,ulDataLen为flen,pSignature为cert_rsa_priv_enc参数to;
其中,在PKCS#11接口中,参数hSession为已打开的会话,pData为cert_rsa_priv_enc中的参数from,ulDataLen为flen,pSignature为cert_rsa_priv_enc参数to;
步骤105-5:客户端将所述签名结果的长度返回;
本实施例中,如果没有查找到私钥句柄,则返回的签名结果的长度为0;
步骤106:客户端对所述私钥对象的结构成员进行初始化,将所述私钥对象的n和e初始化为用户选择的证书公钥的n和e,将所述私钥对象的私钥加密函数初始化为用户选择的证书的私钥加密函数;
具体为,根据OpenSSL在SSL双向认证过程中,对私钥对象的使用,对私钥对象的结构成员进行初始化;
根据预先约定的OpenSSL数据对象RSA_METHOD的大小分配缓冲区:RSA_METHODrsa_pri={0};
本实施例中,私钥对象的结构成员包括:BIGNUM*n;BIGNUM*e;constRSA_METHOD*meth;intflags;;
其中*meth中包括成员int(*rsa_priv_enc)(intflen,constunsignedchar*from,unsignedchar*to,RSA*rsa,intpadding);和模幂函数int(*bn_mod_exp)(BIGNUM*r,constBIGNUM*a,constBIGNUM*p,constBIGNUM*m,BN_CTX*ctx,BN_MONT_CTX*m_ctx);
本实施例中,所述对私钥对象的结构成员进行初始化,具体为:
步骤106-1:将私钥对象的第一结构成员flags设置为不需要检测;
本实施例中,将私钥对象的第一结构成员flags设置为不需要检测,具体为:
通过调用rsa_pri.flags=RSA_METHOD_FLAG_NO_CHECK;将flags设置为不需要检测,其中,RSA_METHOD_FLAG_NO_CHECK为openSSL的宏定义,表示flags不需要检测;
步骤106-2:对私钥对象的第二结构成员meth进行赋值;
本实施例中,对私钥对象的第二结构成员meth进行赋值,具体为:
通过调用private.meth=&rsa_pri;为私钥对象的第二结构成员meth进行赋值,用于修改在SSL认证的过程中签名算法和模拟函数;
步骤106-3:设置私钥对象的结构成员n与e;
本实施例中,所述设置私钥对象的结构成员n与e,具体为:
步骤106-3-1:获取预设类型的证书;
本实施例中,优选的,预设类型的证书为X509类型的证书;
所述获取预设类型的证书,具体为:将所述证书缓冲区的首地址和证书长度,传递给OpenSSL接口,将证书转变为X509类型的证书,具体为:
通过调用X509*x509=d2i_X509(NULL,(constunsignedchar**)&value,(long)valueLen);将所述证书缓冲区的首地址和证书长度,传递给OpenSSL接口,将证书转变为X509类型的证书,其中value为客户端证书所在缓冲区的首地址,valueLen为客户端证书的长度;
步骤106-3-2:获取RSA*类型的公钥pubKey;
在本实施例中,获取RSA*类型的公钥pubKey,具体为:将获取的x509格式中的证书公钥数据的首地址以及x509格式中证书公钥数据长度,传递给OpenSSL接口,得到RSA*类型的公钥pubKey,具体为:
通过调用RSA*pubKey=d2i_RSAPublicKey(NULL,(constunsignedchar**)&x509->cert_info->key->public_key->data,x509->cert_info->key->public_key->length);将获取的x509格式中的证书公钥数据的首地址以及x509格式中证书公钥数据长度,传递给OpenSSL接口,得到RSA*类型的公钥pubKey;
步骤106-3-3:将证书公钥的n和e赋给私钥对象的n和e;
在本实施例中,将证书公钥的n和e赋给私钥对象,具体为:通过调用private.n=BN_dup(pubKey->n);和private.e=BN_dup(pubKey->e);将证书公钥的n和e赋给私钥对象的n和e;
步骤106-4:对私钥对象的私钥加密函数进行初始化;
在本实施例中,对私钥加密函数进行初始化,具体为:通过调用rsa_pri.rsa_priv_enc=cert_rsa_priv_enc;对私钥加密函数进行初始化,使得在使用私钥rsa_pri加密时,启用cert_rsa_priv_enc函数:
步骤107:客户端创建SSL客户端安全传输协议,根据所述SSL客户端安全传输协议,创建SSL连接句柄,根据所述SSL连接句柄,注册所述用户选择的证书和所述私钥对象,将所述用户选择的证书注册为客户端证书,将所述私钥对象注册为客户端私钥对象;
本实施例中,所述注册客户端证书,具体为:
步骤102-1:客户端创建SSL客户端安全传输协议;
优选的,在本实施例中,使用的安全传输协议为TLSv1和SSLv3,用于在两个通道应用程序之间提供保密性和数据完整性;除此之外,安全传输协议还包括:SSLv2、SSLv3、TLSv1.0、TLSv1.1或TLSv1.2;
本实施例中,步骤102-1具体为:
1)根据预先约定的SSL协议方法的数据结构SSL_method的大小分配传输协议缓冲区;
具体为:根据SSL_methodsslMethod={0};分配传输协议缓冲区;
2)创建SSL客户端安全传输协议;
具体为:通过调用sslMethod=TLSv1_client_method();创建SSL客户端使用协议;
步骤102-2:客户端将已创建的SSL客户端安全传输协议传递给openSSL接口,创建SSL连接句柄;
本实施例中,将已创建的SSL客户端安全传输协议sslMethod传递给openSSL接口,创建openSSL连接句柄ctx,具体为:调用SSL_CTX*ctx=SSL_CTX_new(sslMethod);其中ctx为openSSL连接句柄的首地址;
步骤102-3:客户端根据创建的所述SSL连接句柄,注册客户端证书;
本实施例中,注册客户端证书,具体为:通过调用intret=SSL_CTX_use_certificate_ASN1(ctx,valueLen,value);注册客户端证书,其中,ctx为创建的所述openSSL连接句柄的首地址ctx,value为所述证书缓冲区的首地址,valueLen为客户端证书的长度;
其中,当ret的值为0时,表示注册客户端证书失败,返回错误信息,当ret的值为非0时,表示注册客户端证书成功;
在本实施例中,所述将所述私钥对象注册为客户端私钥对象,具体为:将所述SSL连接句柄的首地址ctx和所述私钥句柄缓冲区的首地址prikey传递给OpenSSL接口,具体为:
通过调用SSL_CTX_use_RSAPrivateKey(ctx,&prikey);将所述私钥对象注册为客户端私钥对象,其中,ctx为所述SSL连接句柄的首地址,prikey为所述私钥对象缓冲区的首地址;
步骤108:客户端根据设置的CA证书的文件名称和文件路径,注册CA证书,根据注册CA证书函数的返回值判断是否能够注册成功,如果是,则执行步骤109,否则返回错误信息;
本实施例中,所述注册信任CA证书,具体为:
1)设置CA证书的文件名称;
具体为:通过调用constchar*CAfile=”CAFile.PEM”;设置CA证书的文件名称CAfile为CAFile.PEM;
2)设置CA证书的文件路径;
具体为:通过调用constchar*CAPath=”/mnt/sdcard/CACert/”;设置CA证书的文件路径CAPath为/mnt/sdcard/CACert/;
3)根据CA证书的文件名称和CA证书的文件路径,注册CA证书;
具体为:通过调用IntSSL_CTX_load_verify_locations(SSL_CTX*ctx,constchar*CAfile,constchar*CAPath);注册CA证书,其中ctx为步骤102-2中创建的连接句柄的首地址,CAfile为CA证书的文件名称,CAPath为CA证书的文件路径;
如果函数返回值为1,则表示注册CA证书成功,如果函数返回值为0,则表示注册信任CA证书失败;
步骤109:客户端根据已创建的所述SSL连接句柄,构造验证服务器证书回调函数,根据所述SSL连接句柄和已构造的所述验证服务器证书回调函数,注册验证服务器证书回调函数;
所述注册验证服务器证书回调函数,具体为:
步骤109-1:构造验证服务器证书的回调函数;
本实施例中,构造验证服务器证书的回调函数,具体为:通过调用Intverify_callback(X509_STORE_CTX*ctx,void*arg);构造验证服务器证书的回调函数,其中,ctx为步骤102-2中创建的SSL连接句柄的首地址,arg用于验证服务器证书是否为信任服务器证书;
步骤109-2:注册验证服务器证书的回调函数;
本实施例中,注册验证服务器证书的回调函数,具体为:通过调用SSL_CTX_set_cert_verify_callback(ctx,verify_callback,sslCert);注册验证服务器证书回调函数;其中,ctx为创建的连接句柄的首地址,verify_callback为已构造的验证服务器证书的回调函数,sslCert用于验证服务器证书是否为信任服务器证书;
当创建连接函数被调用时,如图4所示,执行以下操作:
步骤S1:客户端根据所述网络请求中的第二数据创建服务器与客户端之间的连接;
具体为,所述根据所述SSL服务器地址和所述端口号创建服务器与客户端之间的连接,具体为:
1)设置SSL服务器地址和端口号;
具体为:通过调用BIO_set_connect_hostname(bio,192.168.12.39:443);设置SSL服务器地址192.168.12.39,端口号443;
2)创建服务器与客户端之间的连接;
具体为:通过调用BIO*bio=BIO_new_ssl_connect(ctx);创建服务器与客户端之间的连接;
步骤S2:客户端向服务器发送服务器证书请求,接收服务器返回的第一数据包;
本实施例中,所述第一数据包包括:服务器证书、待签名数据和获取客户端证书请求;
步骤S3:客户端使用CA证书对所述第一数据包中的服务器证书进行验证,判断验证是否成功,如果是,则执行步骤S5,否则执行步骤S4;
步骤S4:客户端将服务器证书传递给所述验证服务器证书的回调函数中,判断是否能够验证成功,如果是,则执行步骤S5,否则返回错误信息;
步骤S5:客户端根据客户端证书的n、e和私钥对象的n、e的对应关系,查找客户端证书私钥对象;
具体为:根据客户端证书的模数和公开幂可知用户选择的证书的模数和公开幂,根据所述客户端对所述私钥对象的模数和公开幂进行初始化时,将所述私钥对象的模数和公开幂初始化为所述用户选择的证书的模数和公开幂,查找到私钥对象,根据所述私钥对象可知客户端证书私钥对象;
本实施例中,根据预先约定的对私钥加密函数的初始化,可知private.meth->rsa_priv_enc=cert_rsa_priv_enc;
步骤S6:客户端为客户端证书私钥对象的n和e转换后得到字符串分配转换字符缓冲区,将客户端证书私钥对象的n和e转换为预设类型的字符串;
所述预设类型的字符串为char*类型的字符串;
本实施例中,步骤109-6具体为:
1)为私钥加密函数的参数rsa的n和e转换后的字符串分配转换字符串缓冲区;
具体为:根据unsignedcharpModulus[4096]={0};和unsignedcharpExponent[4096]={0};为私钥加密函数的参数rsa的n和e转换后的字符串分配转换字符串缓冲区;
2)将客户端证书的证书私钥的n和e转换为预设类型的字符串,并将转换结果保存在所述转换字符串缓冲区中;
具体为:通过调用BN_bn2bin(rsa->e,pExponent);和BN_bn2bin(rsa->n,pModulus);将客户端证书的证书私钥的n和e转换为char*类型,并将结果保存在所述转换字符串缓冲区中;得到的n和e对应的字符串的长度为:unsignedlongulModulus=BN_num_bytes(rsa->n);和unsignedlongulExpLength=BN_num_bytes(rsa->e);
步骤S7:客户端根据得到的n和e所在转换字符串缓冲区的首地址及所述转换字符串缓冲区的长度,查找私钥句柄;
在本实施例中,所述查找私钥句柄,具体包括:
步骤S7-1:填充私钥模板;
1)根据要填充的模板需求,指明要填充的模板为私钥模板;
具体为:通过调用CK_OBJECT_CLASSdataClass=CKO_PRIVATE;为dataClass赋值,指明要填充的模板为私钥模板;
2)填充私钥模板;
具体为:通过调用CK_ATTRIBUTEpTemplate[]={{CKA_CLASS,&dataClass,sizeof(dataClass)}};填充私钥模板;
步骤S7-2:根据所述会话句柄和所述私钥模板,查找私钥句柄;
本实施例中,步骤S7-2具体为:
步骤S7-2-1:根据所述会话句柄和所述私钥模板,设置查找私钥句柄;
本实施例中,设置查找私钥句柄,具体为:通过调用CK_RVC_FindObjectsInit(CK_SESSION_HANDLEhSession,CK_ATTRIBUTE_PTRpTemplate,CK_ULONGulCount);设置查找私钥句柄;其中,hSession为获取的所述智能密钥设备会话句柄;pTemplate为所述私钥模板,ulCount为pTemplate所指区域CK_ATTRIBUTE结构体的个数,本实施例中,得到的ulCount的值为1;
步骤S7-2-2:根据预先约定的私钥句柄的结构大小,为私钥句柄分配私钥句柄缓冲区,并获取所述私钥句柄缓冲区的首地址;
本实施例中,步骤S7-2-2具体为:
1)为私钥句柄分配私钥句柄缓冲区;
具体为:通过调用CK_OBJECT_HANDLEpriHandle=0,为私钥句柄分配缓冲区;
2)获取所述私钥句柄缓冲区的首地址;
具体为:通过调用CK_SESSIONHANDLE_PTRphObject=&priHandle;获取所述私钥句柄缓冲区的首地址;
步骤S7-2-3:根据所述会话句柄,查找私钥句柄,并将查找到的私钥句柄保存在所述私钥句柄缓冲区中;
本实施例中,查找私钥句柄,并将查找到的私钥句柄保存在所述私钥句柄缓冲区中,具体为:
通过调用CK_RVC_FindObjects(CK_SESSION_HANDLEhSession,CK_OBJECT_HANDLE_PTRphObject,CK_ULONGulMaxObjectCount,CK_ULONG_PTRpulObjectCount);查找私钥句柄,其中,hSession为所述会话句柄,phObject为分配的私钥句柄缓冲区的首地址,即私钥句柄保存在priHandle中,ulMaxObjectCount为获取私钥句柄的最大个数,pulObjectCount为实际获取到的私钥句柄的个数;
步骤S7-2-4:结束查找私钥句柄;
本实施例中,结束查找私钥句柄,具体为:通过调用C_FindObjectsFinal(hsession);结束查找私钥句柄;
步骤S8:客户端设置私钥句柄和签名算法;
本实施例中,步骤S8具体为:
1)指定签名算法;
具体为:通过调用CK_MECHANISMmechanism={CKM_RSA_PKCS,NULL_PTR,0};指定签名算法为CKM_RSA_PKCS;
2)设置签名算法;
具体为:通过调用C_SignInit(hSession,&mechanism,priHandle);设置签名算法,其中,hSession为会话句柄,mechanism为指定的签名算法,priHandle为私钥句柄;
步骤S9:客户端调用所述签名函数,使用智能密钥设备对第一数据包中的待签名数据进行签名,得到签名结果;
所述签名函数为PKCS#11接口签名函数C_Sign
本实施例中,步骤S9具体为:
步骤S9-1:根据预先约定的PKCS#11数据结构的大小为返回长度分配缓返回长度缓冲区,并获取所述返回长度缓冲区的首地址;
本实施例中,步骤S9-1具体为:
1)为返回长度分配返回长度缓冲区;
具体为:根据CK_ULONGulSignSignatureLen=4096;为返回长度分配返回长度缓冲区;
2)获取所述返回长度缓冲区的首地址;
具体为:通过调用pulSignatureLen=&ulSignSignatureLen;获取所述返回长度缓冲区的首地址pulSignatureLen;
步骤S9-2:调用PKCS#11接口签名函数C_Sign,使用智能密钥设备进行签名,得到签名结果及签名结果的长度;
本实施例中,获取签名结果的长度pulSignatureLen,具体为:
通过调用CK_RVC_Sign(CK_SESSION_HANDLEhSession,CK_BYTE_PTRpData,CK_ULONGulDataLen,CK_BYTE_PTRpSignature,CK_ULONG_PTRpulSignatureLen);获取签名结果的长度pulSignatureLen,其中CK_ULONGulSignatureLen为返回的签名结果的长度,即为cert_rsa_priv_enc的返回值;pSignature为返回的签名结果,其中,在PKCS#11接口中,参数hSession为已打开的会话,pData为cert_rsa_priv_enc中的参数from,ulDataLen为flen,pSignature为cert_rsa_priv_enc参数to;
步骤S10:客户端根据第一数据包中的获取客户端证书请求,向服务器返回第二数据包;
所述第二数据包,包括:客户端证书和所述签名结果;
步骤S11:客户端接收服务器对所述第二数据包处理后返回的验证结果,并判断验证结果,当验证结果为成功时,成功建立双向认证。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。
Claims (14)
1.一种实现智能密钥设备双向认证的方法,其特征在于,包括:
步骤S1:客户端获取用户输入的HTTP地址,根据所述HTTP地址生成请求消息,将所述请求消息发送给系统组件,通过所述系统组件向网络服务器发起网络请求;
步骤S2:所述客户端监听所述系统组件发起的网络请求,当监听到有网络请求发起时,截获所述网络请求,判断网络请求中的第一数据是否为预设字符串,如果是,则获取所述网络请求中的第二数据,执行步骤S3,否则返回不截获响应;
步骤S3:所述客户端从智能密钥设备中获取智能密钥设备证书并显示,等待接收用户对所述智能密钥设备证书的选择;
步骤S4:所述客户端接收用户选择的证书,创建私钥对象,对所述私钥对象进行构造,将私钥对象中的私钥加密函数构造为使用所述智能密钥设备进行签名;
步骤S5:所述客户端对所述私钥对象的结构成员进行初始化,将所述私钥对象的模数和公开幂初始化为所述用户选择的证书公钥的模数和公开幂,将所述私钥对象的私钥加密函数初始化为所述用户选择的证书的私钥加密函数;
步骤S6:所述客户端创建SSL连接句柄,根据所述SSL连接句柄,注册所述用户选择的证书和所述私钥对象,将注册后的证书作为客户端证书,将注册后的私钥对象作为客户端私钥对象;
当创建连接函数被调用时,执行以下操作:
步骤A1:所述客户端根据获取到的所述网络请求中的第二数据,创建客户端与服务器的连接;
步骤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中,所述对所述私钥对象进行构造,具体为:
步骤C1:所述客户端预先约定为私钥对象的模数和公开幂转换的字符串分配缓冲区,然后将私钥对象的模数和公开幂转换为预设类型;
步骤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中,所述注册所述用户选择的证书,具体为:
步骤D1:所述客户端创建SSL客户端安全传输协议;
步骤D2:所述客户端将已创建的所述SSL客户端安全传输协议传递给OpenSSL接口,创建SSL连接句柄;
步骤D3:所述客户端根据已创建的所述SSL连接句柄,注册用户选择的证书,将注册后的证书作为客户端证书。
10.根据权利要求1所述的方法,其特征在于,所述网络请求中的第二数据包括服务器地址和端口号。
11.根据权利要求1所述的方法,其特征在于,所述步骤S6之后还包括:
步骤E1:所述客户端根据设置的CA证书的文件名称和文件路径,注册CA证书;
步骤E2:所述客户端构造验证服务器证书回调函数,注册所述验证服务器证书回调函数。
12.根据权利要求11所述的方法,其特征在于,所述步骤A2中,所述对所述第一数据包中的服务器证书进行验证,具体为:
步骤F1:所述客户端使用所述CA证书对所述第一数据包中的服务器证书进行验证,判断验证是否成功,如果是,则执行步骤A3,否则执行步骤F2;
步骤F2:所述客户端将所述服务器证书传递给所述验证服务器证书回调函数中,判断是否能够验证成功,如果是,则执行步骤A3,否则返回错误信息。
13.根据权利要求8所述的方法,其特征在于,所述步骤A3中,所述客户端根据客户端证书的模数和公开幂和客户端证书私钥对象的模数和公开幂的对应关系,查找所述客户端证书私钥对象,具体为:根据客户端证书的模数和公开幂可知用户选择的证书的模数和公开幂,根据所述客户端对所述私钥对象的模数和公开幂进行初始化时,将所述私钥对象的模数和公开幂初始化为所述用户选择的证书的模数和公开幂,查找到私钥对象,根据所述私钥对象可知客户端证书私钥对象。
14.根据权利要求13所述的方法,其特征在于,所述步骤A3中,根据预先对私钥加密函数的构造,使用所述智能密钥设备对第一数据包的待签名数据进行签名,得到签名结果,具体为:
步骤G1:所述客户端为客户端证书私钥对象的模数和公开幂转换后得到的字符串分配转换字符缓冲区,将客户端证书私钥对象的模数和公开幂转换为预设类型的字符串;
步骤G2:所述客户端根据得到的模数和公开幂所在转换字符串缓冲区的首地址及所述转换字符串缓冲区的长度,查找私钥句柄;
步骤G3:所述客户端设置私钥句柄和签名算法;
步骤G4:所述客户端调用所述签名算法,使用智能密钥设备对第一数据包的待签名数据进行签名,得到签名结果。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310361807.3A CN103457939B (zh) | 2013-08-19 | 2013-08-19 | 一种实现智能密钥设备双向认证的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310361807.3A CN103457939B (zh) | 2013-08-19 | 2013-08-19 | 一种实现智能密钥设备双向认证的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103457939A CN103457939A (zh) | 2013-12-18 |
CN103457939B true CN103457939B (zh) | 2016-04-06 |
Family
ID=49739893
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310361807.3A Active CN103457939B (zh) | 2013-08-19 | 2013-08-19 | 一种实现智能密钥设备双向认证的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103457939B (zh) |
Families Citing this family (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104811421A (zh) * | 2014-01-24 | 2015-07-29 | 中辉世纪传媒发展有限公司 | 基于数字版权管理的安全通信方法及装置 |
CN105827655B (zh) * | 2016-05-27 | 2019-04-16 | 飞天诚信科技股份有限公司 | 一种智能密钥设备及其工作方法 |
CN106534116A (zh) * | 2016-11-10 | 2017-03-22 | 北京锐安科技有限公司 | 非对称加密方法及装置、非对称解密方法及装置 |
EP3389237B1 (de) * | 2017-04-10 | 2019-04-03 | ise Individuelle Software und Elektronik GmbH | Verfahren, vorrichtung, computerlesbares medium und system zum aufbau von verbindungen zwischen einem client und einem ziel- oder endgerät |
CN107248075B (zh) * | 2017-05-19 | 2020-07-07 | 飞天诚信科技股份有限公司 | 一种实现智能密钥设备双向认证和交易的方法及装置 |
CN110855714B (zh) * | 2019-11-29 | 2021-09-14 | 广州鲁邦通物联网科技有限公司 | 一种多租户设备的安全连接方法和系统 |
CN113347010B (zh) * | 2021-08-05 | 2021-11-05 | 深圳市财富趋势科技股份有限公司 | 基于ssl-tls协议的双向认证方法、系统 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101383707A (zh) * | 2007-09-03 | 2009-03-11 | 郑建德 | 一种轻量级认证系统及其关键算法 |
CN101393628A (zh) * | 2008-11-12 | 2009-03-25 | 北京飞天诚信科技有限公司 | 一种新型的网上安全交易系统和方法 |
CN101621509A (zh) * | 2009-07-31 | 2010-01-06 | 浪潮电子信息产业股份有限公司 | 一种应用ssl通信协议安全负载均衡的设计架构及方法 |
CN101626364A (zh) * | 2008-07-08 | 2010-01-13 | 赵运磊 | 一类可基于口令、抗秘密数据泄露的认证和密钥交换方法 |
CN101883122A (zh) * | 2010-07-30 | 2010-11-10 | 迈普通信技术股份有限公司 | 安全连接创建方法以及用于创建安全连接的客户端设备 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8144874B2 (en) * | 2006-09-06 | 2012-03-27 | Paul McGough | Method for obtaining key for use in secure communications over a network and apparatus for providing same |
US20090204964A1 (en) * | 2007-10-12 | 2009-08-13 | Foley Peter F | Distributed trusted virtualization platform |
US20120284506A1 (en) * | 2010-04-30 | 2012-11-08 | T-Central, Inc. | Methods and apparatus for preventing crimeware attacks |
-
2013
- 2013-08-19 CN CN201310361807.3A patent/CN103457939B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101383707A (zh) * | 2007-09-03 | 2009-03-11 | 郑建德 | 一种轻量级认证系统及其关键算法 |
CN101626364A (zh) * | 2008-07-08 | 2010-01-13 | 赵运磊 | 一类可基于口令、抗秘密数据泄露的认证和密钥交换方法 |
CN101393628A (zh) * | 2008-11-12 | 2009-03-25 | 北京飞天诚信科技有限公司 | 一种新型的网上安全交易系统和方法 |
CN101621509A (zh) * | 2009-07-31 | 2010-01-06 | 浪潮电子信息产业股份有限公司 | 一种应用ssl通信协议安全负载均衡的设计架构及方法 |
CN101883122A (zh) * | 2010-07-30 | 2010-11-10 | 迈普通信技术股份有限公司 | 安全连接创建方法以及用于创建安全连接的客户端设备 |
Also Published As
Publication number | Publication date |
---|---|
CN103457939A (zh) | 2013-12-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103457939B (zh) | 一种实现智能密钥设备双向认证的方法 | |
CN109922077B (zh) | 一种基于区块链的身份认证方法及其系统 | |
US9021552B2 (en) | User authentication for intermediate representational state transfer (REST) client via certificate authority | |
CN102984127B (zh) | 一种以用户为中心的移动互联网身份管理及认证方法 | |
CN108881224A (zh) | 一种配电自动化系统的加密方法及相关装置 | |
CN108965230A (zh) | 一种安全通信方法、系统及终端设备 | |
CN101247232B (zh) | 数据交换传输中基于数字签名的加密技术方法 | |
US20170201382A1 (en) | Secure Endpoint Devices | |
WO2019178942A1 (zh) | 一种进行ssl握手的方法和系统 | |
CN112883015A (zh) | 区块链数据管理方法、设备及存储介质 | |
CN103746962B (zh) | 一种goose电力实时报文加解密方法 | |
US20170126623A1 (en) | Protected Subnet Interconnect | |
CN102404347A (zh) | 一种基于公钥基础设施的移动互联网接入认证方法 | |
CN104394172A (zh) | 单点登录装置和方法 | |
US10862690B2 (en) | Technique for handling data in a data network | |
CN112804356B (zh) | 一种基于区块链的联网设备监管认证方法及系统 | |
CN101202630A (zh) | 在tr069综合终端管理平台加解密的方法和系统 | |
CN105142134A (zh) | 参数获取以及参数传输方法和装置 | |
CN105049448B (zh) | 单点登录装置和方法 | |
CN112994897A (zh) | 证书查询方法、装置、设备及计算机可读存储介质 | |
CN111756530B (zh) | 量子服务移动引擎系统、网络架构及相关设备 | |
KR101839048B1 (ko) | 사물 인터넷 환경의 종단간 보안 플랫폼 | |
CN102970134B (zh) | 将硬件密码设备的算法用于pkcs#7数据封装的方法及系统 | |
Wang et al. | A content auditing method of IPsec VPN | |
WO2015104567A1 (en) | Secure communication between a server and a client web browser |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |