一種實現智能密鑰設備雙向認證的方法
【專利摘要】本發明公開了一種實現智能密鑰設備雙向認證的方法,屬于信息安全領域。所述方法包括:當客戶端監聽到系統組件發起的網絡請求時,截獲網絡請求,客戶端從智能密鑰設備中獲取證書,接收用戶選擇的證書,創建私鑰對象,并對其進行構造和初始化,將用戶選擇的證書和私鑰對象分別注冊為客戶端證書和客戶端私鑰對象,當創建連接函數被調用時,客戶端請求服務器證書,驗證服務器證書通過后,根據客戶端證書和客戶端證書私鑰對象進行簽名,將簽名結果和客戶端證書發給服務器,接收服務器返回的結果,當結果為成功時,成功創建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日
【發明者】陸舟, 于華章 申請人:飛天誠信科技股份有限公司