欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種定位國密證書的方法和裝置及系統(tǒng)與流程

文檔序號(hào):11409264閱讀:514來源:國知局
一種定位國密證書的方法和裝置及系統(tǒng)與流程
本發(fā)明涉及信息安全領(lǐng)域,特別涉及一種定位國密證書的方法和裝置及系統(tǒng)。

背景技術(shù):
SSL(SecureSocketsLayer,安全套接字層)是一種國際標(biāo)準(zhǔn)的加密及身份認(rèn)證通訊協(xié)議。SSL協(xié)議是一種在網(wǎng)絡(luò)傳輸層之上的,基于瀏覽器和WEB服務(wù)器之間的安全連接技術(shù)。目前,B/S(瀏覽器/服務(wù)器)系統(tǒng)框架,就是依賴WEB服務(wù)器對(duì)SSL技術(shù)的支持,利用數(shù)字證書來實(shí)現(xiàn)系統(tǒng)的身份認(rèn)證。當(dāng)用戶使用瀏覽器訪問WEB服務(wù)器時(shí),會(huì)在客戶端和服務(wù)器端之間建立安全的SSL通道。目前流行的IE、Netscape、Opera等瀏覽器均支持SSL技術(shù)。數(shù)字證書是由國家認(rèn)可的,具有權(quán)威性、可信性和公正性的第三方證書認(rèn)證機(jī)構(gòu)(CA)頒發(fā)的一個(gè)可信的數(shù)字化文件,根據(jù)采用的密碼算法不同,可以分為國密證書、RSA證書等。其中,國密證書是基于SM2密碼算法,采用GB/T16262系列標(biāo)準(zhǔn)的DER(DistinguishedEncodingRules,區(qū)分編碼規(guī)則)編碼規(guī)則,對(duì)證書中的各項(xiàng)信息進(jìn)行編碼,組成特定的證書數(shù)據(jù)結(jié)構(gòu)的一種數(shù)字證書。CryptographicServiceProvider(簡稱CSP)是微軟用來在Windows平臺(tái)上提供第三方加密模塊的接口標(biāo)準(zhǔn)。CSP接口標(biāo)準(zhǔn)是一個(gè)包含了標(biāo)準(zhǔn)加密算法實(shí)現(xiàn)的軟件模塊。CSP模塊直接和硬件加密設(shè)備安全協(xié)處理器交互。CSP模塊包含了一些標(biāo)準(zhǔn)加密算法的實(shí)現(xiàn),實(shí)現(xiàn)的算法包括:非對(duì)稱加密算法RSA、對(duì)稱加密算法DES、摘要算法MD2、MD5、SHA1。CSP模塊是CAPI函數(shù)的具體執(zhí)行者,同時(shí)CSP模塊也提供了密鑰的安全存儲(chǔ)和使用機(jī)制。Windows應(yīng)用程序只要調(diào)用CAPI函數(shù)就可以獲得系統(tǒng)提供的、標(biāo)準(zhǔn)的加解密和證書的操作功能?,F(xiàn)有技術(shù)中,基于B/S(瀏覽器/服務(wù)器)框架的系統(tǒng)的登錄身份認(rèn)證,依賴于服務(wù)器端證書和客戶端證書的雙向SSL認(rèn)證來完成,這就需要中間件將智能密鑰設(shè)備中的數(shù)字證書注冊到瀏覽器的證書存儲(chǔ)區(qū)中。因此,當(dāng)系統(tǒng)要使用數(shù)字證書時(shí),可以從證書存儲(chǔ)區(qū)中定位數(shù)字證書。但是,當(dāng)智能密鑰設(shè)備中的數(shù)字證書包含國密證書時(shí),中間件不能將國密證書注冊到瀏覽器的證書存儲(chǔ)區(qū)中。因此,當(dāng)系統(tǒng)要使用國密證書時(shí),會(huì)有如何定位國密證書的技術(shù)問題。

技術(shù)實(shí)現(xiàn)要素:
本發(fā)明提供了一種定位國密證書的方法和裝置及系統(tǒng),用以解決現(xiàn)有技術(shù)中無法定位國密證書的技術(shù)問題。本發(fā)明提供了一種定位國密證書的方法,所述方法包括:步驟A1:中間件的函數(shù)等待被調(diào)用,若第一函數(shù)被調(diào)用,則執(zhí)行步驟A2;若第二函數(shù)被調(diào)用,則執(zhí)行步驟A4;若第三函數(shù)被調(diào)用,則執(zhí)行步驟A6;若第四函數(shù)被調(diào)用,則執(zhí)行步驟A8;步驟A2:判斷獲取到的當(dāng)前容器名是否為空,如果是,則獲取中間件私有CSP句柄,輸出中間件私有CSP句柄并返回成功標(biāo)識(shí);否則,執(zhí)行步驟A3;步驟A3:根據(jù)當(dāng)前容器名獲取設(shè)備名和設(shè)備容器名,根據(jù)所述設(shè)備名和所述設(shè)備容器名定位當(dāng)前設(shè)備,判斷是否定位到當(dāng)前設(shè)備,如果是,則根據(jù)所述當(dāng)前設(shè)備設(shè)置當(dāng)前設(shè)備容器私有CSP句柄,輸出所述當(dāng)前設(shè)備容器私有CSP句柄,返回成功標(biāo)識(shí),返回步驟A1;否則,返回失敗標(biāo)識(shí),返回步驟A1;步驟A4:判斷獲取到的當(dāng)前枚舉參數(shù)的類型,若所述當(dāng)前枚舉參數(shù)的類型是枚舉容器參數(shù)類型,則執(zhí)行步驟A5;步驟A5:獲取與主機(jī)連接的智能密鑰設(shè)備的容器名列表,獲取所述容器名列表中的當(dāng)前容器名,判斷所述當(dāng)前容器名是否存在,如果是,則輸出所述當(dāng)前容器名并返回成功標(biāo)識(shí),返回步驟A1;否則,返回失敗標(biāo)識(shí),返回步驟A1;步驟A6:判斷獲取到的當(dāng)前設(shè)備容器私有CSP句柄和國密算法標(biāo)識(shí)是否合法,如果是,則執(zhí)行步驟A7;否則,返回失敗標(biāo)識(shí),返回步驟A1;步驟A7:根據(jù)所述當(dāng)前設(shè)備容器私有CSP句柄和所述國密算法標(biāo)識(shí),查找當(dāng)前設(shè)備的容器名為所述當(dāng)前容器名的容器中是否存在國密用法密鑰,如果是查找到,則將預(yù)設(shè)國密用法密鑰句柄作為國密算法密鑰句柄,輸出所述國密算法密鑰句柄并返回成功標(biāo)識(shí),返回步驟A1;否則,返回失敗標(biāo)識(shí),返回步驟A1;步驟A8:判斷獲取到的當(dāng)前設(shè)備容器私有CSP句柄和國密算法密鑰句柄是否合法,如果是,則執(zhí)行步驟A9;否則,返回失敗標(biāo)識(shí),返回步驟A1;步驟A9:根據(jù)所述當(dāng)前設(shè)備容器私有CSP句柄和所述國密算法密鑰句柄查找到當(dāng)前設(shè)備中的容器名為所述當(dāng)前容器名的容器,讀取容器中的國密證書數(shù)據(jù),判斷是否讀取到合法的國密證書數(shù)據(jù),如果是,則輸出所述國密證書數(shù)據(jù),并且返回成功標(biāo)識(shí),返回步驟A1;否則返回失敗標(biāo)識(shí),返回步驟A1。本發(fā)明提供了一種定位國密證書的裝置,所述裝置包括:第一判斷模塊,用于當(dāng)中間件的第一函數(shù)被調(diào)用時(shí),判斷獲取到的當(dāng)前容器名是否為空,如果是,則觸發(fā)第一獲取模塊;否則,觸發(fā)第二獲取模塊;所述第一獲取模塊,用于獲取中間件私有CSP句柄,觸發(fā)第一輸出模塊;所述第一輸出模塊,用于輸出中間件私有CSP句柄和成功標(biāo)識(shí);所述第二獲取模塊,用于根據(jù)當(dāng)前容器名獲取設(shè)備名和設(shè)備容器名,根據(jù)所述設(shè)備名和所述設(shè)備容器名定位當(dāng)前設(shè)備,觸發(fā)第二判斷模塊;所述第二判斷模塊,用于判斷是否定位到當(dāng)前設(shè)備,如果是,則觸發(fā)第三獲取模塊;否則,觸發(fā)第二輸出模塊;所述第三獲取模塊,用于根據(jù)所述當(dāng)前設(shè)備設(shè)置當(dāng)前設(shè)備容器私有CSP句柄,觸發(fā)第三輸出模塊;所述第二輸出模塊,用于輸出失敗標(biāo)識(shí);所述第三輸出模塊,用于輸出所述當(dāng)前設(shè)備容器私有CSP句柄和成功標(biāo)識(shí);所述第三判斷模塊,用于當(dāng)中間件的第二函數(shù)被調(diào)用時(shí),判斷獲取到的當(dāng)前枚舉參數(shù)的類型,若所述當(dāng)前枚舉參數(shù)的類型是枚舉容器參數(shù)類型,觸發(fā)第四獲取模塊;所述第四獲取模塊,用于獲取與主機(jī)連接的智能密鑰設(shè)備的容器名列表,獲取所述容器名列表中的當(dāng)前容器名,觸發(fā)第四判斷模塊;所述第四判斷模塊,用于判斷所述當(dāng)前容器名是否存在,如果是,則觸發(fā)第四輸出模塊;否則,觸發(fā)第五輸出模塊;所述第四輸出模塊,用于輸出所述當(dāng)前容器名和成功標(biāo)識(shí);所述第五輸出模塊,用于輸出失敗標(biāo)識(shí);所述第五判斷模塊,用于當(dāng)中間件的第三函數(shù)被調(diào)用時(shí),判斷獲取到的當(dāng)前設(shè)備容器私有CSP句柄和國密算法標(biāo)識(shí)是否合法,如果是,則觸發(fā)第五獲取模塊;否則,觸發(fā)第六輸出模塊;所述第五獲取模塊,用于根據(jù)所述當(dāng)前設(shè)備容器私有CSP句柄和所述國密算法標(biāo)識(shí),查找當(dāng)前設(shè)備的容器名為所述當(dāng)前容器名的容器獲取國密用法密鑰,觸發(fā)第六判斷模塊;所述第六判斷模塊,用于判斷是否獲取到所述國密用法密鑰,如果是,則觸發(fā)第六獲取模塊;否則,觸發(fā)第六輸出模塊;所述第六獲取模塊,用于將預(yù)設(shè)國密用法密鑰句柄作為國密算法密鑰句柄,觸發(fā)第七輸出模塊;所述第六輸出模塊,用于輸出失敗標(biāo)識(shí);所述第七輸出模塊,用于輸出所述國密算法密鑰句柄和成功標(biāo)識(shí);第七判斷模塊,用于當(dāng)中間件的第四函數(shù)被調(diào)用時(shí),判斷獲取到的當(dāng)前設(shè)備容器私有CSP句柄和國密算法密鑰句柄是否合法,如果是,則觸發(fā)第七獲取模塊;否則,觸發(fā)第八輸出模塊;所述第七獲取模塊,用于根據(jù)所述當(dāng)前設(shè)備容器私有CSP句柄和所述國密算法密鑰句柄查找到當(dāng)前設(shè)備中的容器名為所述當(dāng)前容器名的容器,獲取容器中的國密證書數(shù)據(jù),觸發(fā)第八判斷模塊;所述第八判斷模塊判斷是否讀取到合法的國密證書數(shù)據(jù),如果是,則觸發(fā)第九輸出模塊;否則觸發(fā)第八輸出模塊;所述第九輸出模塊,用于輸出所述國密證書數(shù)據(jù)和返回成功標(biāo)識(shí);所述第八輸出模塊,用于輸出失敗標(biāo)識(shí)。本發(fā)明提供了一種定位國密證書的系統(tǒng),包括服務(wù)器、安裝有瀏覽器、上層應(yīng)用、中間件的主機(jī)和智能密鑰設(shè)備,當(dāng)所述中間件的注冊證書模塊檢測到智能密鑰設(shè)備連接到主機(jī)時(shí),獲取智能密鑰設(shè)備的設(shè)備信息和證書列表,遍歷證書列表,判斷當(dāng)前證書的類型,如果當(dāng)前證書類型是國密證書類型,則繼續(xù)遍歷;如果當(dāng)前證書類型是非國密證書類型,則將非國密證書類型證書注冊到瀏覽器的證書存儲(chǔ)區(qū)中,繼續(xù)遍歷;當(dāng)所有證書被遍歷,則結(jié)束證書注冊流程,所述系統(tǒng)包括:服務(wù)器第一獲取模塊,用于獲取用戶通過單向SSL登錄輸入的用戶信息,觸發(fā)服務(wù)器第一判斷模塊;所述服務(wù)器第一判斷模塊,用于判斷用戶信息是否合法,若獲取到合法的用戶信息,則觸發(fā)服務(wù)器第二判斷模塊;所述服務(wù)器第二判斷模塊,用于當(dāng)獲取到待簽數(shù)據(jù)時(shí),服務(wù)器根據(jù)預(yù)設(shè)選擇證書條件選擇證書類型,當(dāng)服務(wù)器選擇的證書類型為國密證書類型時(shí),觸發(fā)服務(wù)器第二獲取模塊;所述服務(wù)器第二獲取模塊,用于根據(jù)所述用戶信息獲取私有CSP名和認(rèn)證信息,觸發(fā)服務(wù)器第一發(fā)送模塊;所述服務(wù)器第一發(fā)送模塊,用于將預(yù)設(shè)國密證書類型標(biāo)識(shí)、所述私有CSP名、所述認(rèn)證信息和所述待簽數(shù)據(jù)作為國密證書類型信息發(fā)送給所述上層應(yīng)用,等待獲取所述上層應(yīng)用返回的國密簽名數(shù)據(jù);上層應(yīng)用第一接收模塊,用于接收國密證書類型信息,觸發(fā)上層應(yīng)用第一發(fā)送模塊;所述上層應(yīng)用第一發(fā)送模塊,用于當(dāng)獲取到國密證書類型信息時(shí),調(diào)用主機(jī)操作系統(tǒng)的第一接口函數(shù)根據(jù)私有CSP名將預(yù)設(shè)容器名作為當(dāng)前容器參數(shù)傳遞給所述中間件的第一函數(shù),觸發(fā)中間件第一獲取模塊;所述中間件第一獲取模塊,用于當(dāng)所述中間件的所述第一函數(shù)獲取到的當(dāng)前容器參數(shù)為預(yù)設(shè)容器名時(shí),根據(jù)預(yù)設(shè)容器名設(shè)置中間件私有CSP句柄,觸發(fā)中間件第一輸出模塊,所述中間件第一輸出模塊,用于輸出中間件私有CSP句柄和成功標(biāo)識(shí),觸發(fā)上層應(yīng)用第二發(fā)送模塊;所述上層應(yīng)用第二發(fā)送模塊,用于設(shè)置當(dāng)前枚舉參數(shù)為第一枚舉容器參數(shù),調(diào)用主機(jī)操作系統(tǒng)的第二接口函數(shù)將中間件私有CSP句柄和當(dāng)前枚舉參數(shù)傳遞給所述中間件的第二函數(shù),觸發(fā)中間件第二獲取模塊;所述中間件第二獲取模塊,用于當(dāng)所述中間件的所述第二函數(shù)獲取到中間件私有CSP句柄和第一枚舉容器參數(shù)時(shí),獲取與主機(jī)連接的智能密鑰設(shè)備的容器名列表,獲取所述容器名列表中的第一容器名,觸發(fā)中間件第一判斷模塊;所述中間件第一判斷模塊,用于判斷所述第一容器名是否存在,如果是,則將所述第一容器名作為當(dāng)前容器名,觸發(fā)中間件第二輸出模塊;否則,觸發(fā)中間件第三輸出模塊;所述中間件第二輸出模塊,用于輸出所述當(dāng)前容器名和成功標(biāo)識(shí),觸發(fā)上層應(yīng)用第一判斷模塊;所述中間件第三輸出模塊,用于輸出失敗標(biāo)識(shí),觸發(fā)上層應(yīng)用第一判斷模塊;所述上層應(yīng)用第一判斷模塊,用于判斷是否獲取到當(dāng)前容器名,如果是,則觸發(fā)上層應(yīng)用第三發(fā)送模塊;否則,觸發(fā)上層應(yīng)用報(bào)錯(cuò)模塊;所述上層應(yīng)用報(bào)錯(cuò)模塊,用于報(bào)錯(cuò)退出;所述上層應(yīng)用第三發(fā)送模塊,用于調(diào)用主機(jī)操作系統(tǒng)的所述第一接口函數(shù)根據(jù)中間件私有CSP句柄,將當(dāng)前容器名作為當(dāng)前容器參數(shù)傳遞給中間件的第一函數(shù),觸發(fā)中間件第三獲取模塊;所述中間件第三獲取模塊,用于當(dāng)所述中間件的所述第一函數(shù)獲取到當(dāng)前容器名時(shí),解析所述當(dāng)前容器名,獲取設(shè)備名和設(shè)備容器名,根據(jù)所述設(shè)備名和所述設(shè)備容器名定位當(dāng)前設(shè)備,觸發(fā)中間件第二判斷模塊;所述中間件第二判斷模塊,用于判斷是否定位到當(dāng)前設(shè)備,如果是,則觸發(fā)中間件第四獲取模塊;否則,觸發(fā)中間件第四輸出模塊;所述中間件第四獲取模塊,用于根據(jù)所述當(dāng)前設(shè)備設(shè)置當(dāng)前設(shè)備容器私有CSP句柄,觸發(fā)中間件第五輸出模塊;所述中間件第五輸出模塊,用于輸出所述當(dāng)前設(shè)備容器私有CSP句柄和成功標(biāo)識(shí),觸發(fā)上層應(yīng)用第二判斷模塊;所述中間件第四輸出模塊,用于輸出失敗標(biāo)識(shí),觸發(fā)上層應(yīng)用第二判斷模塊;所述上層應(yīng)用第二判斷模塊,用于判斷是否獲取到當(dāng)前設(shè)備容器私有CSP句柄,如果是,則觸發(fā)上層應(yīng)用第四發(fā)送模塊;否則,觸發(fā)所述上層應(yīng)用報(bào)錯(cuò)模塊;所述上層應(yīng)用第四發(fā)送模塊,用于調(diào)用主機(jī)操作系統(tǒng)的第三接口函數(shù)將當(dāng)前設(shè)備容器私有CSP句柄和預(yù)設(shè)國密簽名算法標(biāo)識(shí)傳遞給所述中間件的第三函數(shù),觸發(fā)所述中間件第五獲取模塊;所述中間件第五獲取模塊,用于當(dāng)所述中間件的所述第三函數(shù)獲取到當(dāng)前設(shè)備容器私有CSP句柄和預(yù)設(shè)國密算法標(biāo)識(shí)時(shí),根據(jù)所述當(dāng)前設(shè)備容器私有CSP句柄和所述國密算法標(biāo)識(shí),查找當(dāng)前設(shè)備的容器名為所述當(dāng)前容器名的容器獲取國密簽名算法密鑰,觸發(fā)中間件第三判斷模塊;所述中間件第三判斷模塊,用于判斷是否獲取到國密簽名算法密鑰,如果是,則觸發(fā)中間件第六獲取模塊;否則,觸發(fā)中間件第七輸出模塊;所述中間件第六獲取模塊,用于將預(yù)設(shè)國密簽名算法密鑰句柄作為國密算法密鑰句柄,觸發(fā)中間件第六輸出模塊;所述中間件第六輸出模塊,用于輸出所述國密算法密鑰句柄和成功標(biāo)識(shí),觸發(fā)上層應(yīng)用第三判斷模塊;所述中間件第七輸出模塊,用于輸出失敗標(biāo)識(shí),觸發(fā)上層應(yīng)用第三判斷模塊;所述上層應(yīng)用第三判斷模塊,用于判斷是否獲取到國密算法密鑰句柄,如果是,在觸發(fā)上層應(yīng)用第五發(fā)送模塊;否則,觸發(fā)所述上層應(yīng)用報(bào)錯(cuò)模塊;所述上層應(yīng)用第五發(fā)送模塊,用于調(diào)用主機(jī)操作系統(tǒng)的第四接口函數(shù)將當(dāng)前設(shè)備容器私有CSP句柄和國密算法密鑰句柄傳遞給所述中間件的第四函數(shù),觸發(fā)中間件第七獲取模塊;所述中間件第七獲取模塊,用于當(dāng)所述中間件的第四函數(shù)獲取到當(dāng)前設(shè)備容器私有CSP句柄和國密算法密鑰句柄時(shí),根據(jù)當(dāng)前設(shè)備容器私有CSP句柄和國密算法密鑰句柄獲取國密證書數(shù)據(jù),觸發(fā)中間件第四判斷模塊;所述中間件第四判斷模塊,用于判斷是否讀取到合法的國密證書數(shù)據(jù),如果是,則觸發(fā)中間件第八輸出模塊;否則,觸發(fā)中間件第九輸出模塊;所述中間件第九輸出模塊,用于輸出失敗標(biāo)識(shí),觸發(fā)上層應(yīng)用第四判斷模塊;所述中間件第八輸出模塊,用于輸出所述國密證書數(shù)據(jù)和成功標(biāo)識(shí),觸發(fā)上層應(yīng)用第四判斷模塊;所述上層應(yīng)用第四判斷模塊,用于判斷是否獲取到國密證書數(shù)據(jù),如果是,則觸發(fā)上層應(yīng)用第一獲取模塊,否則,觸發(fā)所述上層應(yīng)用報(bào)錯(cuò)模塊;所述上層應(yīng)用第一獲取模塊,用于根據(jù)國密證書數(shù)據(jù)獲取國密證書認(rèn)證信息,觸發(fā)上層應(yīng)用第五判斷模塊;所述上層應(yīng)用第五判斷模塊,用于判斷國密證書認(rèn)證信息是否和認(rèn)證信息相匹配,如果是,則觸發(fā)上層應(yīng)用第二獲取模塊,否則,釋放所述當(dāng)前設(shè)備容器私有CSP句柄,觸發(fā)上層應(yīng)用第六發(fā)送模塊;所述上層應(yīng)用第二獲取模塊,用于獲取國密簽名數(shù)據(jù),觸發(fā)上層應(yīng)用第一返回模塊;所述上層應(yīng)用第一返回模塊,用于向服務(wù)器返回所述國密簽名數(shù)據(jù);所述上層應(yīng)用第六發(fā)送模塊,用于設(shè)置當(dāng)前枚舉參數(shù)為第二枚舉容器參數(shù),調(diào)用主機(jī)操作系統(tǒng)的第二接口函數(shù)將中間件私有CSP句柄和所述當(dāng)前枚舉參數(shù)傳遞所述中間件的所述第二函數(shù),觸發(fā)中間件第八獲取模塊;所述中間件第八獲取模塊,用于當(dāng)所述中間件的所述第二函數(shù)獲取到中間件私有CSP句柄和第二枚舉容器參數(shù)時(shí),獲取當(dāng)前容器名的下一個(gè)容器名,觸發(fā)中間件第五判斷模塊;所述中間件第五判斷模塊,用于判斷所述當(dāng)前容器名的下一個(gè)容器名是否存在,如果是,則將當(dāng)前容器名的下一個(gè)容器名作為當(dāng)前容器名,觸發(fā)所述中間件第二輸出模塊;否則,觸發(fā)所述中間件第三輸出模塊。本發(fā)明的有益效果是:當(dāng)系統(tǒng)要使用國密證書時(shí),可以根據(jù)本發(fā)明獲取到當(dāng)前容器名,根據(jù)當(dāng)前容器名定位到當(dāng)前設(shè)備,根據(jù)當(dāng)前設(shè)備獲取當(dāng)前設(shè)備的容器中的國密證書數(shù)據(jù),從而定位到國密證書。附圖說明圖1-圖6為本發(fā)明實(shí)施例1提供的一種定位國密證書的方法的流程圖;圖7-圖8為本發(fā)明實(shí)施例2提供的一種簽名程序的工作方法流程圖;圖9為本發(fā)明實(shí)施例4提供的一種定位國密證書的裝置的結(jié)構(gòu)圖。具體實(shí)施方式下面將結(jié)合本發(fā)明的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明的一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域技術(shù)人員在沒有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。本發(fā)明實(shí)施例提供了一種將智能密鑰設(shè)備中的證書注冊到瀏覽器的證書存儲(chǔ)區(qū)中的方法,適用于包括服務(wù)器、安裝有瀏覽器、上層應(yīng)用、中間件的主機(jī)和智能密鑰設(shè)備的系統(tǒng),當(dāng)中間件檢測到智能密鑰設(shè)備和主機(jī)連接時(shí),中間件執(zhí)行如下步驟:步驟101:當(dāng)中間件檢測到智能密鑰設(shè)備和主機(jī)連接時(shí),獲取智能密鑰設(shè)備的設(shè)備信息和證書列表;其中,設(shè)備信息中包括智能密鑰設(shè)備的設(shè)備名和設(shè)備ID(ID,身份識(shí)別標(biāo)識(shí))等信息;證書列表包括智能密鑰設(shè)備中的證書信息,其中證書信息可以是證書的版本信息、證書的序列號(hào)信息、證書所使用的簽名算法信息、證書的發(fā)行機(jī)構(gòu)名稱信息、證書的有效期信息、證書所有人的名稱信息、證書所有人的公鑰信息和證書發(fā)行者對(duì)證書的簽名信息等。步驟102:中間件遍歷證書列表,判斷當(dāng)前證書的類型,如果當(dāng)前證書的類型是國密證書類型,則繼續(xù)遍歷;如果當(dāng)前證書的類型是非國密證書類型,則中間件將當(dāng)前證書注冊到瀏覽器的證書存儲(chǔ)區(qū)中,繼續(xù)遍歷;當(dāng)所有證書被遍歷,則結(jié)束證書注冊流程;具體地,中間件遍歷證書列表,判斷當(dāng)前證書的類型,判斷當(dāng)前證書所有人的公鑰信息中的密鑰算法標(biāo)識(shí)是否是國密密鑰標(biāo)識(shí),如果是,則判斷當(dāng)前證書是國密證書,則繼續(xù)遍歷;如果不是國密密鑰標(biāo)識(shí),則判斷當(dāng)前證書類型是非國密證書類型,中間件將非國密證書類型證書注冊到瀏覽器的證書存儲(chǔ)區(qū)中,繼續(xù)遍歷;當(dāng)所有證書被遍歷,則結(jié)束證書注冊流程。需要說明的是,本發(fā)明中的證書均指數(shù)字證書。實(shí)施例1本發(fā)明實(shí)施例1提供了一種定位國密證書的方法,如圖1-圖6所示,中間件執(zhí)行如下步驟:步驟201:中間件的函數(shù)等待被調(diào)用,如果第一函數(shù)被調(diào)用,則執(zhí)行步驟202;如果第二函數(shù)被調(diào)用,則執(zhí)行步驟204;如果第三函數(shù)被調(diào)用,則執(zhí)行步驟207;如果第四函數(shù)被調(diào)用,則執(zhí)行步驟209;如果第五函數(shù)被調(diào)用,則執(zhí)行步驟211;如果第六函數(shù)被調(diào)用,則執(zhí)行步驟213;如果第七函數(shù)被調(diào)用,則執(zhí)行步驟215;本實(shí)施例中,第一函數(shù)可以是CPAcquireContext函數(shù);第二函數(shù)可以是CPGetProvParam函數(shù);第三函數(shù)可以是CPGetUserKey函數(shù);第四函數(shù)可以是CPGetKeyParam函數(shù);第五函數(shù)可以是CPCreateHash函數(shù);第六函數(shù)可以是CPHashData函數(shù);第七函數(shù)可以是CPSignHash函數(shù)。步驟202:判斷獲取到的當(dāng)前容器名是否為空,如果是,則獲取中間件私有CSP句柄,返回成功標(biāo)識(shí),返回步驟201;否則,執(zhí)行步驟203;具體的,根據(jù)當(dāng)前容器參數(shù)獲取當(dāng)前容器名,判斷當(dāng)前容器名是否為空,如果為空,則將一個(gè)無符號(hào)長整型數(shù)值設(shè)置為中間件私有CSP句柄,輸出中間件私有CSP句柄,并返回成功標(biāo)識(shí),返回步驟201;如果不為空,則執(zhí)行步驟203。本實(shí)施例中,成功標(biāo)識(shí)可以是TRUE。步驟203:根據(jù)當(dāng)前容器名獲取設(shè)備名和設(shè)備容器名,根據(jù)設(shè)備名和設(shè)備容器名定位當(dāng)前設(shè)備,判斷是否定位到當(dāng)前設(shè)備,如果是,則根據(jù)當(dāng)前設(shè)備設(shè)置當(dāng)前設(shè)備容器私有CSP句柄,輸出當(dāng)前設(shè)備容器私有CSP句柄,返回成功標(biāo)識(shí),返回步驟201;否則,返回失敗標(biāo)識(shí),返回步驟201;本步驟中,具體包括:步驟a1:根據(jù)當(dāng)前容器名獲取設(shè)備名和設(shè)備容器名,判斷設(shè)備名是否為不為空,如果是,則執(zhí)行步驟a2;否則,執(zhí)行步驟a6;具體地,解析當(dāng)前容器名,根據(jù)解析的結(jié)果獲取設(shè)備名和設(shè)備容器名,判斷設(shè)備名是否為不為空,如果是,則執(zhí)行步驟a2;否則,執(zhí)行步驟a6;例如:解析當(dāng)前容器名,獲取到\\.\ES2001VCR1\le-8A9CF4C7-D8E2-4a4b-AF0A-CE393A03E80D,其中ES2001VCR1為設(shè)備名,le-8A9CF4C7-D8E2-4a4b-AF0A-CE393A03E80D為設(shè)備容器名。步驟a2:根據(jù)設(shè)備名獲取和設(shè)備名相匹配的智能密鑰設(shè)備,查找是否存在和設(shè)備名相匹配的智能密鑰設(shè)備,如果是,則執(zhí)行步驟a3;否則,返回失敗標(biāo)識(shí),返回步驟201。具體地,第一函數(shù)獲取連接到主機(jī)的全部智能密鑰設(shè)備的設(shè)備信息,查找全部的智能密鑰設(shè)備中是否存在和設(shè)備名相同的智能密鑰設(shè)備,如果是,則判斷是存在和設(shè)備名相匹配的智能密鑰設(shè)備,則執(zhí)行步驟a3;否則,判斷不存在和設(shè)備名相匹配的智能密鑰設(shè)備,返回失敗標(biāo)識(shí),結(jié)束。其中,設(shè)備信息包括智能密鑰設(shè)備的設(shè)備名和設(shè)備ID(ID,身份識(shí)別標(biāo)識(shí))等信息。本實(shí)施例中,失敗標(biāo)識(shí)可以是FALSE。步驟a3:查找和設(shè)備名相匹配的智能密鑰設(shè)備中是否存在和設(shè)備容器名相匹配的容器,如果是,則執(zhí)行步驟a4;否則,返回失敗標(biāo)識(shí),返回步驟201。步驟a4:將和設(shè)備名相匹配的智能密鑰設(shè)備作為當(dāng)前設(shè)備,保存當(dāng)前設(shè)備ID;步驟a5:根據(jù)當(dāng)前設(shè)備設(shè)置當(dāng)前設(shè)備容器私有CSP句柄,輸出當(dāng)前設(shè)備容器私有CSP句柄,返回成功標(biāo)識(shí),返回步驟201。步驟a6:根據(jù)所述設(shè)備容器名獲取和所述設(shè)備容器名相匹配的智能密鑰設(shè)備,檢查否存在和設(shè)備容器名相匹配的智能密鑰設(shè)備,如果是,則執(zhí)行步驟a7;否則,返回失敗標(biāo)識(shí),返回步驟201。具體地,獲取到連接到主機(jī)的全部智能密鑰設(shè)備的設(shè)備信息,查找全部的智能密鑰設(shè)備中是否存在以設(shè)備容器名為容器名的容器,如果存在,則判斷是否存在和設(shè)備容器名相匹配的智能密鑰設(shè)備,否則,判斷不存在和設(shè)備容器名相匹配的智能密鑰設(shè)備。其中,設(shè)備信息包括智能密鑰設(shè)備的設(shè)備名和設(shè)備ID(ID,身份識(shí)別標(biāo)識(shí))等信息。步驟a7:判斷是否查找到唯一和設(shè)備容器名相匹配的智能密鑰設(shè)備,如果是,則執(zhí)行步驟a12;否則,執(zhí)行步驟a9;步驟a9:判斷是否需要輸出提示選擇智能密鑰設(shè)備信息,如果是,則執(zhí)行步驟a10;否則,執(zhí)行步驟a11;步驟a10:輸出需要用戶選擇智能密鑰設(shè)備的提示信息,將用戶選擇的智能密鑰設(shè)備作為當(dāng)前設(shè)備,保存當(dāng)前設(shè)備ID,返回步驟a5;步驟a11:將查找到的第一個(gè)和設(shè)備容器名相匹配的智能密鑰設(shè)備作為當(dāng)前設(shè)備,保存當(dāng)前設(shè)備ID,返回步驟a5;步驟a12:將唯一和設(shè)備容器名相匹配的智能密鑰設(shè)備作為當(dāng)前設(shè)備,保存當(dāng)前設(shè)備ID,返回步驟a5;步驟204:判斷獲取到的中間件私有CSP句柄和當(dāng)前枚舉參數(shù)是否合法,如果是,則判斷當(dāng)前枚舉參數(shù)的類型,若當(dāng)前枚舉參數(shù)的類型是枚舉算法參數(shù)類型,則執(zhí)行步驟205,若當(dāng)前枚舉參數(shù)類型是枚舉容器參數(shù)類型,則執(zhí)行步驟206;否則返回失敗標(biāo)識(shí),返回步驟201;本實(shí)施例中,枚舉算法參數(shù)包括:第一枚舉算法參數(shù)和第二枚舉算法參數(shù);枚舉容器參數(shù)包括:第一枚舉容器參數(shù)和第二枚舉容器參數(shù);步驟205:獲取中間件的預(yù)設(shè)算法列表中的當(dāng)前算法標(biāo)識(shí),判斷當(dāng)前算法標(biāo)識(shí)是否存在,如果是,則輸出當(dāng)前算法標(biāo)識(shí),并返回成功標(biāo)識(shí),返回步驟201;否則,返回失敗標(biāo)識(shí),返回步驟201;本實(shí)施例中,中間件的預(yù)設(shè)算法列表中包括中間件支持的所有算法的算法標(biāo)識(shí)。其中,中間件的預(yù)設(shè)算法列表中的算法標(biāo)識(shí)可以是國密算法標(biāo)識(shí)、哈希算法標(biāo)識(shí)、RSA算法標(biāo)識(shí)等,其中,國密算法標(biāo)識(shí)可以是SM2_SIGN、SM2_KEYX,哈希算法標(biāo)識(shí)可以是SM3、MD5、SHA1,RSA算法標(biāo)識(shí)可以是RSA,需要說明的是,其中,SM2_KEYX是國密交換算法標(biāo)識(shí)、SM2_SIGN是國密簽名算法標(biāo)識(shí),哈希算法標(biāo)識(shí)中的SM3是與國密簽名算法標(biāo)識(shí)SM2_SIGN相應(yīng)的摘要算法標(biāo)識(shí)。具體地,當(dāng)枚舉算法參數(shù)類型是第一枚舉算法參數(shù)時(shí),獲取中間件的預(yù)設(shè)算法列表中的第一算法標(biāo)識(shí),判斷第一算法標(biāo)識(shí)是否存在,如果是,則將第一算法標(biāo)識(shí)作為當(dāng)前算法標(biāo)識(shí),輸出當(dāng)前算法標(biāo)識(shí),并返回成功標(biāo)識(shí),返回步驟201;否則,返回失敗標(biāo)識(shí),返回步驟201;當(dāng)枚舉算法參數(shù)類型是第二枚舉算法參數(shù)時(shí),獲取中間件的預(yù)設(shè)算法列表中的當(dāng)前算法標(biāo)識(shí)的下一個(gè)算法標(biāo)識(shí),判斷當(dāng)前算法標(biāo)識(shí)的下一個(gè)算法標(biāo)識(shí)是否存在,如果是,則將當(dāng)前算法標(biāo)識(shí)的下一個(gè)算法標(biāo)識(shí)作為當(dāng)前算法標(biāo)識(shí),輸出當(dāng)前算法標(biāo)識(shí),并返回成功標(biāo)識(shí),返回步驟201;否則,返回失敗標(biāo)識(shí),返回步驟201;步驟206:獲取與主機(jī)連接的智能密鑰設(shè)備的容器名列表,獲取所述容器名列表中的當(dāng)前容器名,判斷當(dāng)前容器名是否存在,如果是,則輸出當(dāng)前容器名并返回成功標(biāo)識(shí),返回步驟201;否則,返回失敗標(biāo)識(shí),返回步驟201;具體地,當(dāng)枚舉容器參數(shù)類型是第一枚舉容器參數(shù)時(shí),獲取與主機(jī)連接的智能密鑰設(shè)備的容器名列表,獲取容器名列表中的第一容器名,判斷第一容器名是否存在,如果是,則將第一容器名作為當(dāng)前容器名,輸出當(dāng)前容器名并返回成功標(biāo)識(shí),返回步驟201;否則,返回失敗標(biāo)識(shí),返回步驟201;當(dāng)枚舉容器參數(shù)類型是第二枚舉容器參數(shù)時(shí),獲取容器名列表中的當(dāng)前容器名的下一個(gè)容器名,判斷當(dāng)前容器名的下一個(gè)容器名是否存在,如果是,則將當(dāng)前容器名的下一個(gè)容器名作為當(dāng)前容器名,輸出當(dāng)前容器名并返回成功標(biāo)識(shí),返回步驟201;否則,返回失敗標(biāo)識(shí),返回步驟201;步驟207:判斷獲取到的當(dāng)前設(shè)備容器私有CSP句柄和國密算法標(biāo)識(shí)是否合法,如果是,則執(zhí)行步驟208;否則,返回失敗標(biāo)識(shí),返回步驟201;步驟208:根據(jù)當(dāng)前設(shè)備容器私有CSP句柄和國密算法標(biāo)識(shí)查找當(dāng)前設(shè)備中的容器名為當(dāng)前容器名的容器中是否存在國密用法密鑰,如果是,則將預(yù)設(shè)國密用法密鑰句柄作為國密算法密鑰句柄,輸出國密算法密鑰句柄并返回成功標(biāo)識(shí),返回步驟201;否則,返回失敗標(biāo)識(shí),返回步驟201;本實(shí)施例中,國密算法標(biāo)識(shí)包括國密簽名算法標(biāo)識(shí)、國密交換算法標(biāo)識(shí)。步驟209:判斷獲取到的當(dāng)前設(shè)備容器私有CSP句柄和國密算法密鑰句柄是否合法,如果是,則執(zhí)行步驟210;否則,返回失敗標(biāo)識(shí),返回步驟201;步驟210:根據(jù)當(dāng)前設(shè)備容器私有CSP句柄和國密算法密鑰句柄查找到當(dāng)前設(shè)備中的容器名為當(dāng)前容器名的容器,讀取容器中的國密證書數(shù)據(jù),判斷是否讀取到合法的國密證書數(shù)據(jù),如果是,則輸出國密證書數(shù)據(jù),并且返回成功標(biāo)識(shí),返回步驟201;否則返回失敗標(biāo)識(shí),返回步驟201;步驟211:判斷獲取到的當(dāng)前設(shè)備容器私有CSP句柄和國密算法密鑰句柄和摘要算法標(biāo)識(shí)是否合法,如果是,則執(zhí)行步驟212;否則,返回失敗標(biāo)識(shí),返回步驟201;步驟212:初始化一個(gè)哈希對(duì)象實(shí)例,將哈希對(duì)象實(shí)例的地址作為哈希句柄,輸出哈希句柄并返回成功標(biāo)識(shí),返回步驟201;步驟213:判斷獲取到的當(dāng)前設(shè)備容器私有CSP句柄和哈希句柄和待簽數(shù)據(jù)是否合法,如果是,則執(zhí)行步驟214;否則,返回失敗標(biāo)識(shí),返回步驟201;步驟214:用哈希句柄對(duì)待簽數(shù)據(jù)做摘要,獲取摘要值并保存待簽數(shù)據(jù),返回成功標(biāo)識(shí),返回步驟201;步驟215:判斷獲取到的當(dāng)前設(shè)備容器私有CSP句柄和哈希句柄和國密簽名算法標(biāo)識(shí)是否合法,如果是,則執(zhí)行步驟216;否則,返回失敗標(biāo)識(shí),返回步驟201;步驟216:判斷是否獲取到國密簽名數(shù)據(jù),如果是,則輸出國密簽名數(shù)據(jù)并返回成功標(biāo)識(shí),返回步驟201;否則,返回失敗標(biāo)識(shí),返回步驟201。本步驟具體包括:b1:判斷是否驗(yàn)證過當(dāng)前設(shè)備PIN碼,如果驗(yàn)證過當(dāng)前設(shè)備PIN碼,則執(zhí)行步驟b2;如果沒有驗(yàn)證過設(shè)備PIN碼,則輸出提示驗(yàn)證設(shè)備PIN碼信息,當(dāng)獲取到合法的當(dāng)前設(shè)備PIN碼時(shí),執(zhí)行步驟b2;步驟b2:獲取國密Z值,當(dāng)當(dāng)前設(shè)備是一代設(shè)備時(shí),根據(jù)國密Z值和哈希句柄獲取的摘要值獲取最終待簽數(shù)據(jù),將最終待簽數(shù)據(jù)發(fā)送給當(dāng)前設(shè)備,獲取國密簽名數(shù)據(jù),輸出國密簽名數(shù)據(jù)并返回成功標(biāo)識(shí),返回步驟201;如果沒有獲取到國密簽名數(shù)據(jù),則返回失敗標(biāo)識(shí),返回步驟201;當(dāng)當(dāng)前設(shè)備是二代設(shè)備時(shí),根據(jù)國密Z值和待簽數(shù)據(jù)獲取最終待簽數(shù)據(jù),將最終待簽數(shù)據(jù)發(fā)送給當(dāng)前設(shè)備,獲取國密簽名數(shù)據(jù),輸出國密簽名數(shù)據(jù)并返回成功標(biāo)識(shí),返回步驟201;如果沒有獲取到國密簽名數(shù)據(jù),則返回失敗標(biāo)識(shí),返回步驟201。實(shí)施例2本發(fā)明實(shí)施例2提供了一種定位國密證書的方法,適用于包括服務(wù)器、安裝有瀏覽器、上層應(yīng)用、中間件的主機(jī)和智能密鑰設(shè)備的系統(tǒng)。本實(shí)施例中,上層應(yīng)用可以是簽名程序。步驟301:服務(wù)器獲取用戶通過單向SSL登錄輸入的用戶信息,判斷用戶信息是否合法,若獲取到合法的用戶信息,則當(dāng)獲取到待簽數(shù)據(jù)時(shí),服務(wù)器根據(jù)預(yù)設(shè)選擇證書條件選擇證書類型,服務(wù)器根據(jù)選擇的證書類型向簽名程序發(fā)送證書類型信息,等待獲取簽名數(shù)據(jù),若獲取到的用戶信息不合法,則輸出錯(cuò)誤提示信息;其中,證書類型包括國密證書類型和非國密證書類型;證書類型信息包括國密證書類型信息和非國密證書類型信息;簽名數(shù)據(jù)包括國密簽名數(shù)據(jù)和非國密簽名數(shù)據(jù)。具體地,服務(wù)器獲取用戶通過單向SSL登錄輸入的用戶信息,判斷用戶信息是否合法,若獲取到合法的用戶信息,則當(dāng)獲取到待簽數(shù)據(jù)時(shí),服務(wù)器根據(jù)預(yù)設(shè)選擇證書條件選擇證書類型,當(dāng)服務(wù)器選擇的證書類型是國密證書類型時(shí),服務(wù)器根據(jù)用戶信息獲取私有CSP名和認(rèn)證信息并將預(yù)設(shè)國密證書類型標(biāo)識(shí)、私有CSP名、認(rèn)證信息和待簽數(shù)據(jù)作為國密證書類型信息發(fā)送給簽名程序,等待獲取國密簽名數(shù)據(jù);當(dāng)選擇的證書類型是非國密證書類型時(shí),將預(yù)設(shè)非國密證書類型標(biāo)識(shí)和待簽數(shù)據(jù)作為非國密證書類型信息發(fā)送給簽名程序,等待獲取非國密簽名數(shù)據(jù),若獲取到的用戶信息不合法,則輸出錯(cuò)誤提示信息;其中,非國密證書類型可以是RSA證書類型。本實(shí)施例中,認(rèn)證信息可以是與用戶信息綁定的國密證書DN(DistinguishedName,甄別名)信息。例如,服務(wù)器獲取與用戶信息綁定的國密證書的DN信息,獲取到DN信息中的CN(Commonname,常用名)屬性信息為“CN=TEST1”,將“CN=TEST1”作為認(rèn)證信息的標(biāo)識(shí)。其中,私有CSP名是指智能密鑰設(shè)備提供商的信息,例如“EnterSafeET199AutoCSPV1.0”。本實(shí)施中,當(dāng)簽名程序獲取到服務(wù)器發(fā)送的證書類型信息時(shí),簽名程序根據(jù)證書類型信息中的預(yù)設(shè)證書類型標(biāo)識(shí)判斷本次簽名所使用的證書類型,如果,預(yù)設(shè)證書類型標(biāo)識(shí)是預(yù)設(shè)非國密證書類型標(biāo)識(shí),則根據(jù)注冊到瀏覽器的證書存儲(chǔ)區(qū)中的非國密證書,按照正常的簽名流程獲取簽名數(shù)據(jù),返回給服務(wù)器;如果,預(yù)設(shè)證書類型標(biāo)識(shí)是預(yù)設(shè)國密證書類型標(biāo)識(shí),則簽名程序執(zhí)行如下步驟,如圖7-圖8所示,包括:步驟401:簽名程序調(diào)用主機(jī)操作系統(tǒng)的第一接口函數(shù)根據(jù)私有CSP名,將預(yù)設(shè)容器名作為當(dāng)前容器參數(shù)傳遞給中間件的第一函數(shù),獲取中間件私有CSP句柄;本步驟中,簽名程序設(shè)置預(yù)設(shè)容器名為NULL。本實(shí)施例中,主機(jī)操作系統(tǒng)可以是微軟提供的Windows操作系統(tǒng)。本實(shí)施例中,第一接口函數(shù)的可以是CryptAcquireContext函數(shù),第一函數(shù)可以是CPAcquireContext函數(shù)。需要說明的是,當(dāng)中間件的第一函數(shù)被調(diào)用時(shí),第一函數(shù)根據(jù)當(dāng)前容器參數(shù)判斷當(dāng)前容器名是否為空,如果為空,則將一個(gè)無符號(hào)長整型數(shù)值設(shè)置為中間件私有CSP句柄,輸出中間件私有CSP句柄,并返回成功標(biāo)識(shí)。本實(shí)施例中,成功標(biāo)識(shí)可以是TRUE。步驟402:簽名程序判斷是否獲取到中間件私有CSP句柄,如果是,則執(zhí)行步驟403;否則,報(bào)錯(cuò)退出;具體地,簽名程序判斷得到的返回值是否為成功標(biāo)識(shí),如果是,則判斷獲取到中間件私有CSP句柄;否則,判斷沒有獲取到中間件私有CSP句柄,報(bào)錯(cuò)退出。本步驟中,簽名程序還可以根據(jù)獲取到的中間件私有CSP句柄是否為空來判斷是否獲取到中間件私有CSP句柄,如果獲取到的中間件私有CSP句柄不為空,則判斷獲取到中間件私有CSP句柄,如果獲取到的中間件私有CSP句柄為空,則判斷沒有獲取到中間件私有CSP句柄,報(bào)錯(cuò)退出。本實(shí)施中,簽名程序根據(jù)獲取到的中間件私有CSP句柄可以定位到智能密鑰設(shè)備提供商提供的中間件。步驟403:簽名程序設(shè)置當(dāng)前枚舉參數(shù)為第一枚舉算法參數(shù),調(diào)用主機(jī)操作系統(tǒng)的第二接口函數(shù),將中間件私有CSP句柄和當(dāng)前枚舉參數(shù)傳遞給中間件的第二函數(shù),枚舉中間件的預(yù)設(shè)算法列表,獲取中間件的預(yù)設(shè)算法列表中的第一算法標(biāo)識(shí),執(zhí)行步驟404;本實(shí)施例中,第二接口函數(shù)可以是CryptGetProvParam函數(shù),第二函數(shù)可以是CPGetProvParam函數(shù);中間件的預(yù)設(shè)算法列表中包括中間件支持的所有算法的算法標(biāo)識(shí)。其中,中間件的預(yù)設(shè)算法列表中的算法標(biāo)識(shí)可以是國密算法標(biāo)識(shí)、哈希算法標(biāo)識(shí)、RSA算法標(biāo)識(shí)等,其中,國密算法標(biāo)識(shí)可以是SM2_SIGN、SM2_KEYX,哈希算法標(biāo)識(shí)可以是SM3、MD5、SHA1,RSA算法標(biāo)識(shí)可以是RSA,需要說明的是,其中,SM2_SIGN是國密簽名算法標(biāo)識(shí),哈希算法標(biāo)識(shí)中的SM3是與國密簽名算法標(biāo)識(shí)SM2_SIGN相應(yīng)的摘要算法標(biāo)識(shí)。本步驟中,簽名程序設(shè)置第一枚舉算法參數(shù)包括設(shè)置第一枚舉算法類型參數(shù)和第一枚舉算法標(biāo)志位參數(shù),具體地,設(shè)置第一枚舉算法類型參數(shù)為PP_ENUMALGS或PP_ENUMALGS_EX,設(shè)置第一枚舉算法標(biāo)志位參數(shù)為CRYPT_FIRST。具體地,當(dāng)中間件的第二函數(shù)獲取到枚舉算法類型參數(shù)為PP_ENUMALGS或PP_ENUMALGS_EX,枚舉算法標(biāo)志位參數(shù)為CRYPT_FIRST時(shí),第二函數(shù)獲取預(yù)設(shè)算法列表中的第一個(gè)算法標(biāo)識(shí),復(fù)位計(jì)數(shù)器,判斷第一算法標(biāo)識(shí)是否存在,如果是,輸出第一算法標(biāo)識(shí)并返回成功標(biāo)識(shí);否則,返回失敗標(biāo)識(shí)。本實(shí)施例中,失敗標(biāo)識(shí)可以是FALSE,第二函數(shù)設(shè)置計(jì)數(shù)器初始值為0。步驟404:簽名程序判斷是否獲取到中間件的預(yù)設(shè)算法列表中的第一算法標(biāo)識(shí),如果是,則將第一算法標(biāo)識(shí)作為當(dāng)前算法標(biāo)識(shí),執(zhí)行步驟405;否則,報(bào)錯(cuò)退出;具體地,簽名程序根據(jù)獲取到的第一算法標(biāo)識(shí)不為空且得到的返回值為成功標(biāo)識(shí),判斷獲取到中間件的預(yù)設(shè)算法列表中的第一算法標(biāo)識(shí),根據(jù)得到的返回值為失敗標(biāo)識(shí),判斷沒有獲取到中間件的預(yù)設(shè)算法列表中的第一算法標(biāo)識(shí)。步驟405:簽名程序設(shè)置當(dāng)前枚舉參數(shù)為第二枚舉算法參數(shù),調(diào)用主機(jī)操作系統(tǒng)的第二接口函數(shù),將中間件私有CSP句柄和當(dāng)前枚舉參數(shù)傳遞給中間件的第二函數(shù),枚舉中間件的預(yù)設(shè)算法列表,獲取當(dāng)前算法標(biāo)識(shí)的下一個(gè)算法標(biāo)識(shí);本步驟中,簽名程序設(shè)置第二枚舉算法參數(shù)包括設(shè)置第二枚舉算法類型參數(shù)和第二枚舉算法標(biāo)志位參數(shù),具體地,設(shè)置第二枚舉算法類型參數(shù)為PP_ENUMALGS或PP_ENUMALGS_EX,設(shè)置第二枚舉算法標(biāo)志位參數(shù)為CRYPT_NEXT。當(dāng)?shù)诙瘮?shù)獲取到第二枚舉算法類型參數(shù)為PP_ENUMALGS或PP_ENUMALGS_EX、第二枚舉算法標(biāo)志位參數(shù)為CRYPT_NEXT時(shí),第二函數(shù)將計(jì)數(shù)器加1,獲取預(yù)設(shè)算法列表中和當(dāng)前計(jì)數(shù)器數(shù)值所對(duì)應(yīng)的算法標(biāo)識(shí),判斷預(yù)設(shè)算法列表中和當(dāng)前計(jì)數(shù)器數(shù)值所對(duì)應(yīng)的算法標(biāo)識(shí)是否存在,如果存在,則將和當(dāng)前計(jì)數(shù)器數(shù)值所對(duì)應(yīng)的算法標(biāo)識(shí)作為當(dāng)前算法標(biāo)識(shí)的下一個(gè)算法標(biāo)識(shí),輸出當(dāng)前算法標(biāo)識(shí)的下一個(gè)算法標(biāo)識(shí),并返回成功標(biāo)識(shí);否則,返回失敗標(biāo)識(shí)。步驟406:簽名程序判斷是否獲取到當(dāng)前算法標(biāo)識(shí)的下一個(gè)算法標(biāo)識(shí),如果是,則將當(dāng)前算法標(biāo)識(shí)的下一個(gè)算法標(biāo)識(shí)作為當(dāng)前算法標(biāo)識(shí),返回步驟405;否則,執(zhí)行步驟407;具體地,簽名程序根據(jù)獲取到的當(dāng)前算法標(biāo)識(shí)的下一個(gè)算法標(biāo)識(shí)不為空且得到的返回值為成功標(biāo)識(shí),判斷獲取到中間件的預(yù)設(shè)算法列表中的當(dāng)前算法標(biāo)識(shí)的下一個(gè)算法標(biāo)識(shí),根據(jù)得到的返回值為失敗標(biāo)識(shí),判斷沒有獲取到中間件的預(yù)設(shè)算法列表中的當(dāng)前算法標(biāo)識(shí)的下一個(gè)算法標(biāo)識(shí)。步驟407:簽名程序根據(jù)獲取到的全部算法標(biāo)識(shí)判斷中間件是否支持國密簽名算法,如果是,則執(zhí)行步驟408;否則,報(bào)錯(cuò)退出;具體地,簽名程序根據(jù)獲取到的中間件的預(yù)設(shè)算法列表中的全部算法標(biāo)識(shí)中是否包含國密簽名算法標(biāo)識(shí)和摘要算法標(biāo)識(shí),如果是,則執(zhí)行步驟408;否則,報(bào)錯(cuò)退出;本實(shí)施例中,簽名程序判斷獲取到的中間件的預(yù)設(shè)算法列表中的算法標(biāo)識(shí)中是否包含SM2_SIGN和SM3,如果包含,則執(zhí)行步驟408;否則,報(bào)錯(cuò)退出。步驟408:簽名程序設(shè)置當(dāng)前枚舉參數(shù)為第一枚舉容器參數(shù),調(diào)用主機(jī)操作系統(tǒng)第二接口函數(shù),將中間件私有CSP句柄和當(dāng)前枚舉參數(shù)傳遞給中間件的第二函數(shù),獲取容器名列表中的第一容器名,將第一容器名作為當(dāng)前容器名,執(zhí)行步驟409;本步驟中,簽名程序設(shè)置第一枚舉容器參數(shù)包括設(shè)置第一枚舉容器類型參數(shù)和第一枚舉容器標(biāo)志位參數(shù),設(shè)置第一枚舉容器類型參數(shù)為PP_ENUMCONTAINERS,設(shè)置第一枚舉容器標(biāo)志位參數(shù)為CRYPT_FIRST。當(dāng)?shù)诙瘮?shù)獲取到第一枚舉容器類型參數(shù)為PP_ENUMCONTAINERS,第一枚舉容器標(biāo)志位參數(shù)為CRYPT_FIRST時(shí),獲取包含所有智能密鑰設(shè)備的容器名的容器名列表,第二函數(shù)獲取容器名列表中的第一個(gè)容器名,復(fù)位計(jì)數(shù)器,判斷第一容器名是否存在,如果是,輸出第一容器名并返回成功標(biāo)識(shí);否則,返回失敗標(biāo)識(shí);本實(shí)施例中,第二函數(shù)設(shè)置計(jì)數(shù)器初始值為0。步驟409:簽名程序判斷是否獲取到當(dāng)前容器名,如果是,則執(zhí)行步驟410;否則,報(bào)錯(cuò)退出;具體地,簽名程序根據(jù)獲取到的當(dāng)前容器名不為空且得到的返回值是為成功標(biāo)識(shí),判斷獲取到當(dāng)前容器名,根據(jù)得到的返回值為失敗標(biāo)識(shí),判斷沒有獲取到當(dāng)前容器名。步驟410:簽名程序調(diào)用主機(jī)操作系統(tǒng)第一接口函數(shù),根據(jù)中間件私有CSP句柄將當(dāng)前容器名作為容器名參數(shù)傳遞給中間件的第一函數(shù),獲取當(dāng)前設(shè)備容器私有CSP句柄;當(dāng)中間件的第一函數(shù)獲取到當(dāng)前容器名時(shí),第一函數(shù)執(zhí)行如下步驟:步驟c1:第一函數(shù)解析當(dāng)前容器名,獲取設(shè)備名和設(shè)備容器名,判斷設(shè)備名是否為不為空,如果是,則執(zhí)行步驟c2;否則,執(zhí)行步驟c6;例如:第一函數(shù)解析當(dāng)前容器名,獲取到\\.\ES2001VCR1\le-8A9CF4C7-D8E2-4a4b-AF0A-CE393A03E80D,其中ES2001VCR1為設(shè)備名,le-8A9CF4C7-D8E2-4a4b-AF0A-CE393A03E80D為設(shè)備容器名。步驟c2:第一函數(shù)查找是否存在和設(shè)備名相匹配的智能密鑰設(shè)備,如果是,則執(zhí)行步驟c3;否則,返回失敗標(biāo)識(shí),結(jié)束。具體地,第一函數(shù)獲取連接到主機(jī)的全部智能密鑰設(shè)備的設(shè)備信息,查找全部的智能密鑰設(shè)備中是否存在和設(shè)備名相同的智能密鑰設(shè)備,如果是,則判斷是存在和設(shè)備名相匹配的智能密鑰設(shè)備,則執(zhí)行步驟c3;否則,判斷不存在和設(shè)備名相匹配的智能密鑰設(shè)備,返回失敗標(biāo)識(shí),結(jié)束。步驟c3:第一函數(shù)查找和設(shè)備名相匹配的智能密鑰設(shè)備中是否存在和設(shè)備容器名相匹配的容器,如果是,則執(zhí)行步驟c4;否則,返回失敗標(biāo)識(shí),結(jié)束。步驟c4:第一函數(shù)將和設(shè)備名相匹配的智能密鑰設(shè)備作為當(dāng)前設(shè)備,保存當(dāng)前設(shè)備ID;步驟c5:第一函數(shù)將一個(gè)無符號(hào)長整型數(shù)值設(shè)置為當(dāng)前設(shè)備容器私有CSP句柄,輸出當(dāng)前設(shè)備容器私有CSP句柄,結(jié)束。步驟c6:第一函數(shù)檢查否存在和設(shè)備容器名相匹配的智能密鑰設(shè)備,如果是,則執(zhí)行步驟c7;否則,返回失敗標(biāo)識(shí),結(jié)束。具體地,獲取連接到主機(jī)的全部智能密鑰設(shè)備的設(shè)備信息,查找全部的智能密鑰設(shè)備中是否存在以設(shè)備容器名為容器名的容器,如果存在,則判斷存在和設(shè)備容器名相匹配的智能密鑰設(shè)備,否則,判斷不存在和設(shè)備容器名相匹配的智能密鑰設(shè)備。步驟c7:第一函數(shù)判斷是否查找到唯一和設(shè)備容器名相匹配的智能密鑰設(shè)備,如果是,則執(zhí)行步驟c12;否則,執(zhí)行步驟c9;步驟c9:第一函數(shù)判斷是否需要輸出提示選擇智能密鑰設(shè)備信息,如果是,則執(zhí)行步驟c10;否則,執(zhí)行步驟c11;步驟c10:第一函數(shù)輸出需要用戶選擇智能密鑰設(shè)備的提示信息,將用戶選擇的智能密鑰設(shè)備作為當(dāng)前設(shè)備,保存當(dāng)前設(shè)備ID,返回步驟c5;步驟c11:第一函數(shù)將查找到的第一個(gè)和設(shè)備容器名相匹配的智能密鑰設(shè)備作為當(dāng)前設(shè)備,保存當(dāng)前設(shè)備ID,返回步驟c5;步驟c12:第一函數(shù)將唯一和設(shè)備容器名相匹配的智能密鑰設(shè)備作為當(dāng)前設(shè)備,保存當(dāng)前設(shè)備ID,返回步驟c5;步驟411:簽名程序判斷是否獲取到當(dāng)前設(shè)備容器私有CSP句柄,如果是,則執(zhí)行步驟412;否則,報(bào)錯(cuò)退出;具體地,簽名程序判斷得到的返回值是否為成功標(biāo)識(shí),如果是,則判斷獲取到當(dāng)前設(shè)備容器私有CSP句柄;否則,判斷沒有獲取到當(dāng)前設(shè)備容器私有CSP句柄,報(bào)錯(cuò)退出。本步驟中,簽名程序還可以根據(jù)獲取到的當(dāng)前設(shè)備容器私有CSP句柄是否為空來判斷是否獲取到當(dāng)前設(shè)備容器私有CSP句柄,如果獲取到的當(dāng)前設(shè)備容器私有CSP句柄不為空,則判斷獲取到當(dāng)前設(shè)備容器私有CSP句柄,如果獲取到的當(dāng)前設(shè)備容器私有CSP句柄為空,則判斷沒有獲取到中間件私有CSP句柄,報(bào)錯(cuò)退出。本實(shí)施例中,簽名程序根據(jù)獲取到的當(dāng)前設(shè)備容器私有CSP句柄可以定位到當(dāng)前設(shè)備中的容器名為當(dāng)前容器名的容器。步驟412:簽名程序調(diào)用主機(jī)操作系統(tǒng)第三接口函數(shù),將當(dāng)前設(shè)備容器私有CSP句柄和預(yù)設(shè)國密簽名算法標(biāo)識(shí)傳遞給中間件的第三函數(shù),獲取當(dāng)前設(shè)備中的容器名為當(dāng)前容器名的容器中的國密算法密鑰句柄;本實(shí)施例中,第三接口函數(shù)可以是CryptGetUserKey函數(shù),第三函數(shù)可以是CPGetUserKey函數(shù)。本步驟中,簽名程序調(diào)用CryptGetUserKey函數(shù),將當(dāng)前密鑰容器私有CSP句柄和國密簽名算法標(biāo)識(shí)傳遞給相應(yīng)中間件的CPGetUserKey函數(shù),獲取國密算法密鑰句柄。需要說明的是,當(dāng)?shù)谌瘮?shù)獲取到當(dāng)前設(shè)備容器私有CSP句柄和預(yù)設(shè)國密簽名算法標(biāo)識(shí)時(shí),第三函數(shù)根據(jù)當(dāng)前設(shè)備容器私有CSP句柄和預(yù)設(shè)國密簽名算法標(biāo)識(shí)查找當(dāng)前設(shè)備中的容器名為當(dāng)前容器名的容器中是否存在國密簽名密鑰,如果查找到,則將預(yù)設(shè)國密簽名算法密鑰句柄賦值給國密算法密鑰句柄,輸出國密算法密鑰句柄并返回成功標(biāo)識(shí);否則,返回失敗標(biāo)識(shí)。其中,預(yù)設(shè)國密簽名算法密鑰句柄是一個(gè)無符號(hào)長整型數(shù)值。步驟413:簽名程序判斷是否獲取到國密算法密鑰句柄,如果是,則執(zhí)行步驟415;否則,釋放當(dāng)前設(shè)備容器私有CSP句柄,執(zhí)行步驟414;具體地,簽名程序判斷獲取到國密算法密鑰句柄是否為空值,如果獲取到的國密算法密鑰句柄不為空值,則判斷獲取到國密算法密鑰句柄;否則,釋放當(dāng)前設(shè)備容器私有CSP句柄,執(zhí)行步驟414;本步驟中,簽名程序還可以根據(jù)得到的返回值是否為成功標(biāo)識(shí),判斷是否獲取到國密算法密鑰句柄,如果為成功標(biāo)識(shí),則判斷獲取國密算法密鑰句柄;否則,沒有獲取到國密算法密鑰句柄。步驟414:簽名程序設(shè)置當(dāng)前枚舉參數(shù)為第二枚舉容器參數(shù),調(diào)用主機(jī)操作系統(tǒng)第二接口函數(shù),將私有CSP句柄和第二枚舉容器參數(shù)傳遞給中間件的第二函數(shù),獲取當(dāng)前容器名的下一個(gè)容器名,將當(dāng)前容器名的下一個(gè)容器名作為當(dāng)前容器名,返回步驟409;本步驟中,簽名程序設(shè)置第二枚舉容器參數(shù)包括設(shè)置第二枚舉容器類型參數(shù)和第二枚舉容器標(biāo)志位參數(shù),設(shè)置第二枚舉容器類型參數(shù)為PP_ENUMCONTAINERS,設(shè)置第二枚舉容器標(biāo)志位參數(shù)為CRYPT_NEXT。當(dāng)?shù)诙瘮?shù)獲取到第二枚舉容器標(biāo)志位參數(shù)為CRYPT_NEXT時(shí),將計(jì)數(shù)器加1,獲取容器名列表中和當(dāng)前計(jì)數(shù)器數(shù)值所對(duì)應(yīng)的容器名,判斷容器名列表中和當(dāng)前計(jì)數(shù)器數(shù)值一致的序號(hào)所對(duì)應(yīng)的容器名是否存在,如果存在,則將當(dāng)前計(jì)數(shù)器數(shù)值所對(duì)應(yīng)的容器名作為當(dāng)前容器名的下一個(gè)容器名,輸出當(dāng)前容器名的下一個(gè)容器名,并返回成功標(biāo)識(shí);否則,返回失敗標(biāo)識(shí)。步驟415:簽名程序根據(jù)當(dāng)前設(shè)備容器私有CSP句柄和國密算法密鑰句柄獲取當(dāng)前設(shè)備中的容器名為當(dāng)前容器名的容器中的國密證書數(shù)據(jù),執(zhí)行步驟416;具體地,簽名程序調(diào)用主機(jī)操作系統(tǒng)第四接口函數(shù),將當(dāng)前設(shè)備容器私有CSP句柄和國密算法密鑰句柄傳遞給中間件的第四函數(shù),獲取國密證書數(shù)據(jù);本實(shí)施例中,第四接口函數(shù)可以是CryptGetKeyParam函數(shù),第四函數(shù)可以是CPGetKeyParam函數(shù)。需要說明的是,當(dāng)?shù)谒暮瘮?shù)獲取到當(dāng)前設(shè)備容器私有CSP句柄和國密算法密鑰句柄時(shí),第四函數(shù)查找到當(dāng)前設(shè)備中的容器名為當(dāng)前容器名的容器,讀取容器中的國密證書數(shù)據(jù),判斷是否讀取到合法的國密證書數(shù)據(jù),如果是,則輸出國密證書數(shù)據(jù),并且返回成功標(biāo)識(shí);否則返回失敗標(biāo)識(shí)。步驟416:簽名程序判斷是否獲取到國密證書數(shù)據(jù),如果是,則執(zhí)行步驟417;否則,報(bào)錯(cuò)退出;具體地,簽名程序根據(jù)獲取到的國密證書數(shù)據(jù)是否不為空,且得到的返回值是否為成功標(biāo)識(shí),判斷獲取到國密證書數(shù)據(jù),根據(jù)得到的返回值為失敗標(biāo)識(shí),判斷沒有獲取到國密證書數(shù)據(jù)。步驟417:簽名程序根據(jù)國密證書數(shù)據(jù)獲取國密證書上下文結(jié)構(gòu)體,執(zhí)行步驟418;具體地,簽名程序調(diào)用主機(jī)操作系統(tǒng)的解析證書函數(shù),根據(jù)國密證書數(shù)據(jù)獲取國密證書上下文結(jié)構(gòu)體;本實(shí)施例中,解析證書函數(shù)可以是CertCreateCertificateContext函數(shù)。步驟418:簽名程序根據(jù)國密證書上下文結(jié)構(gòu)體獲取國密證書認(rèn)證信息;具體地,簽名程序調(diào)用主機(jī)操作系統(tǒng)的證書名轉(zhuǎn)換格式函數(shù),根據(jù)國密證書上下文結(jié)構(gòu)體獲取國密證書認(rèn)證信息;本實(shí)施例中,證書名轉(zhuǎn)換格式函數(shù)可以是CertNameToStr函數(shù)。本步驟中,簽名程序獲取到的國密證書認(rèn)證信息可以是國密證書的DN信息。例如,簽名程序根據(jù)國密證書上下文結(jié)構(gòu)體調(diào)用主機(jī)操作系統(tǒng)提供的CertNameToStr函數(shù)獲取國密證書的DN信息,獲取到DN信息中的CN屬性信息為“CN=TEST1”,將CN屬性信息作為國密證書認(rèn)證信息的標(biāo)識(shí)。步驟419:簽名程序判斷國密證書認(rèn)證信息是否和認(rèn)證信息相匹配,如果是,則執(zhí)行步驟420;否則,釋放當(dāng)前設(shè)備容器私有CSP句柄,返回步驟414;具體地,簽名程序查找國密證書認(rèn)證信息的標(biāo)識(shí)中是否包含和認(rèn)證信息的標(biāo)識(shí)一致的標(biāo)識(shí)信息,如果是,則匹配;否則,不匹配。例如,若獲取到的國密證書認(rèn)證信息的標(biāo)識(shí)為“CN=TEST1”,認(rèn)證信息的標(biāo)識(shí)為“CN=TEST1”,簽名程序查找到國密證書認(rèn)證信息的標(biāo)識(shí)中包含和認(rèn)證信息的標(biāo)識(shí)一致的標(biāo)識(shí)信息,則判斷國密證書認(rèn)證信息和認(rèn)證信息相匹配,若獲取到的國密證書認(rèn)證信息的標(biāo)識(shí)為“CN=TEST2”,簽名程序查找國密證書認(rèn)證信息的標(biāo)識(shí)中不含有和認(rèn)證信息的標(biāo)識(shí)一致的標(biāo)識(shí)信息,則判斷國密證書認(rèn)證信息和認(rèn)證信息不匹配,則釋放當(dāng)前設(shè)備容器私有CSP句柄,返回步驟413;步驟420:簽名程序根據(jù)當(dāng)前設(shè)備容器私有CSP句柄、國密算法密鑰句柄、預(yù)設(shè)國密簽名算法標(biāo)識(shí)、摘要算法標(biāo)識(shí)和待簽數(shù)據(jù),獲取國密簽名數(shù)據(jù),將國密簽名數(shù)據(jù)返回給服務(wù)器。本步驟具體包括:步驟d1:簽名程序調(diào)用主機(jī)操作系統(tǒng)的第五接口函數(shù),將當(dāng)前設(shè)備容器私有CSP句柄和國密算法密鑰句柄和摘要算法標(biāo)識(shí)傳遞給相應(yīng)中間件的第五函數(shù),獲取哈希句柄;本實(shí)施例中,第五接口函數(shù)可以是CryptCreateHash函數(shù),第五函數(shù)可以是CPCreateHash函數(shù)。當(dāng)?shù)谖搴瘮?shù)獲取到合法的當(dāng)前設(shè)備容器私有CSP句柄和國密算法密鑰句柄和摘要算法標(biāo)識(shí)時(shí),初始化一個(gè)哈希對(duì)象實(shí)例,將哈希對(duì)象實(shí)例的地址賦值給哈希句柄,輸出哈希句柄并返回成功標(biāo)識(shí)。步驟d2:簽名程序調(diào)用主機(jī)操作系統(tǒng)的第六接口函數(shù),將當(dāng)前設(shè)備容器私有CSP句柄和哈希句柄和待簽數(shù)據(jù)傳遞給相應(yīng)中間件的第六函數(shù),獲取摘要值,判斷是否獲取到摘要值,如果是,則執(zhí)行步驟d3;否則,報(bào)錯(cuò)退出;本實(shí)施例中,第六接口函數(shù)可以是CryptHashData函數(shù),第六函數(shù)可以是CPHashData函數(shù)。具體地,簽名程序根據(jù)返回值是否為成功標(biāo)識(shí),判斷是否獲取到摘要值,如果得到的返回值為成功標(biāo)識(shí),則判斷獲取到摘要值;否則,判斷沒有獲取到摘要值。當(dāng)?shù)诹瘮?shù)獲取到哈希句柄時(shí),第六函數(shù)根據(jù)哈希句柄查找哈希對(duì)象,如果查找到,則用哈希句柄對(duì)待簽數(shù)據(jù)做哈希,獲取摘要值并保存待簽數(shù)據(jù),返回成功標(biāo)識(shí);否則,返回失敗標(biāo)識(shí)。步驟d3:簽名程序調(diào)用主機(jī)操作系統(tǒng)的第七接口函數(shù),將當(dāng)前設(shè)備容器私有CSP句柄和哈希句柄和預(yù)設(shè)國密簽名算法標(biāo)識(shí)傳遞給相應(yīng)中間件的第七函數(shù),獲取簽名數(shù)據(jù),判斷是否獲取到簽名數(shù)據(jù),是則將簽名數(shù)據(jù)返回給服務(wù)器;否則報(bào)錯(cuò)退出。本實(shí)施中,第七接口函數(shù)可以是CryptSignHash函數(shù),第七函數(shù)可以是CPSignHash函數(shù)。當(dāng)?shù)谄吆瘮?shù)獲取到當(dāng)前設(shè)備容器私有CSP句柄和哈希句柄和國密簽名算法標(biāo)識(shí)時(shí),第七函數(shù)判斷是否驗(yàn)證過當(dāng)前設(shè)備PIN碼,如果驗(yàn)證過當(dāng)前設(shè)備PIN碼,則執(zhí)行步驟e1;如果沒有驗(yàn)證過設(shè)備PIN碼,則輸出提示驗(yàn)證設(shè)備PIN碼信息,當(dāng)獲取到合法的當(dāng)前設(shè)備PIN碼時(shí),則執(zhí)行步驟e1;步驟e1:第七函數(shù)獲取國密Z值,當(dāng)當(dāng)前設(shè)備是一代設(shè)備時(shí),根據(jù)國密Z值和摘要值獲取最終待簽數(shù)據(jù),將最終待簽數(shù)據(jù)發(fā)給當(dāng)前設(shè)備,獲取簽名數(shù)據(jù),輸出簽名數(shù)據(jù)并返回成功標(biāo)識(shí),如果沒有獲取到簽名數(shù)據(jù),則返回失敗標(biāo)識(shí);當(dāng)當(dāng)前設(shè)備是二代設(shè)備時(shí),根據(jù)國密Z值和待簽數(shù)據(jù)獲取最終待簽數(shù)據(jù),將最終待簽數(shù)據(jù)發(fā)送給當(dāng)前設(shè)備,獲取國密簽名數(shù)據(jù),輸出國密簽名數(shù)據(jù)并返回成功標(biāo)識(shí),如果沒有獲取到國密簽名數(shù)據(jù),則返回失敗標(biāo)識(shí)。還需說明的是,當(dāng)簽名程序獲取到服務(wù)器發(fā)送的證書類型信息時(shí),簽名程序根據(jù)證書類型信息中的預(yù)設(shè)證書類型標(biāo)識(shí)判斷本次簽名所使用的證書類型,如果,預(yù)設(shè)證書類型標(biāo)識(shí)是預(yù)設(shè)非國密證書類型標(biāo)識(shí),則使用非國密證書獲取簽名數(shù)據(jù),返回給服務(wù)器;如果,預(yù)設(shè)證書類型標(biāo)識(shí)是預(yù)設(shè)國密證書類型標(biāo)識(shí),則,簽名程序還可以執(zhí)行如下步驟:簽名程序根據(jù)私有CSP名獲取中間件私有CSP句柄,根據(jù)中間件私有CSP句柄獲取第一容器名,當(dāng)獲取到第一容器名,將第一容器名作為當(dāng)前容器名之后,執(zhí)行步驟409。實(shí)施例3本發(fā)明實(shí)施例3提供了一種定位國密證書的方法,適用于包括服務(wù)器、安裝有瀏覽器、上層應(yīng)用、中間件的主機(jī)和智能密鑰設(shè)備的系統(tǒng)。本實(shí)施例中,上層應(yīng)用可以是簽名程序。步驟501:服務(wù)器獲取用戶通過單向SSL登錄輸入的用戶信息,判斷用戶信息是否合法,若獲取到合法的用戶信息,則當(dāng)獲取到待簽數(shù)據(jù)時(shí),服務(wù)器根據(jù)預(yù)設(shè)選擇證書條件選擇證書類型,服務(wù)器根據(jù)選擇的證書類型向簽名程序發(fā)送證書類型信息,等待獲取簽名數(shù)據(jù),若獲取到的用戶信息不合法,則輸出錯(cuò)誤提示信息;其中,證書類型包括國密證書類型和非國密證書類型;證書類型信息包括國密證書類型信息和非國密證書類型信息;簽名數(shù)據(jù)包括國密簽名數(shù)據(jù)和非國密簽名數(shù)據(jù)。具體地,服務(wù)器獲取用戶通過單向SSL登錄輸入的用戶信息,判斷用戶信息是否合法,若獲取到合法的用戶信息,則當(dāng)獲取到待簽數(shù)據(jù)時(shí),服務(wù)器根據(jù)預(yù)設(shè)選擇證書條件選擇證書類型,當(dāng)服務(wù)器選擇的證書類型是國密證書時(shí),服務(wù)器根據(jù)用戶信息獲取私有CSP名和認(rèn)證信息和國密密鑰容器名并將預(yù)設(shè)國密證書類型標(biāo)識(shí)和私有CSP名和認(rèn)證信息和國密密鑰容器名和待簽數(shù)據(jù)作為國密證書類型信息發(fā)送給簽名程序,等待獲取國密簽名數(shù)據(jù);當(dāng)選擇的證書類型是非國密證書類型時(shí),將預(yù)設(shè)非國密證書類型標(biāo)識(shí)和待簽數(shù)據(jù)作為非國密證書類型信息發(fā)送給簽名程序,等待獲取非國密簽名數(shù)據(jù),若獲取到的用戶信息不合法,則輸出錯(cuò)誤提示信息;其中,非國密證書類型可以是RSA證書類型。本實(shí)施例中,認(rèn)證信息可以是與用戶信息綁定的國密證書DN(DistinguishedName,甄別名)信息。例如,服務(wù)器獲取與用戶信息綁定的國密證書的DN信息,獲取到DN信息中的CN(Commonname,常用名)屬性信息為“CN=TEST1”,將“CN=TEST1”作為認(rèn)證信息的標(biāo)識(shí)。其中,服務(wù)器可以根據(jù)用戶信息查詢服務(wù)器預(yù)設(shè)數(shù)據(jù)庫獲取和用戶信息綁定的私有CSP名和國密密鑰容器名。其中,私有CSP名是指智能密鑰設(shè)備提供商的信息,例如“EnterSafeET199AutoCSPV1.0”。本實(shí)施例中,當(dāng)簽名程序獲取到服務(wù)器發(fā)送的證書類型信息時(shí),簽名程序根據(jù)證書類型信息中的預(yù)設(shè)證書類型標(biāo)識(shí)判斷本次簽名所使用的證書類型,如果,預(yù)設(shè)證書類型標(biāo)識(shí)是預(yù)設(shè)非國密證書類型標(biāo)識(shí),則根據(jù)注冊到瀏覽器的證書存儲(chǔ)區(qū)中的非國密證書,按照正常的簽名流程獲取簽名數(shù)據(jù),返回給服務(wù)器;如果,預(yù)設(shè)證書類型標(biāo)識(shí)是預(yù)設(shè)國密證書類型標(biāo)識(shí),則簽名程序執(zhí)行如下步驟:步驟601:簽名程序根據(jù)私有CSP名和國密密鑰容器名獲取當(dāng)前設(shè)備容器私有CSP句柄;具體地,簽名程序調(diào)用主機(jī)操作系統(tǒng)第一接口函數(shù),根據(jù)私有CSP名將國密密鑰容器名傳遞給中間件的第一函數(shù),獲取當(dāng)前設(shè)備容器私有CSP句柄;當(dāng)中間件的第一函數(shù)獲取到國密密鑰容器名時(shí),第一函數(shù)執(zhí)行如下步驟:步驟x1:第一函數(shù)解析國密密鑰容器名,獲取設(shè)備名和設(shè)備容器名,判斷設(shè)備名是否為不為空,如果是,則執(zhí)行步驟x2;否則,執(zhí)行步驟x6;例如:第一函數(shù)解析國密密鑰容器名,獲取到\\.\ES2001VCR1\le-8A9CF4C7-D8E2-4a4b-AF0A-CE393A03E80D,其中ES2001VCR1為設(shè)備名,le-8A9CF4C7-D8E2-4a4b-AF0A-CE393A03E80D為設(shè)備容器名。步驟x2:第一函數(shù)查找是否存在和設(shè)備名相匹配的智能密鑰設(shè)備,如果是,則執(zhí)行步驟x3;否則,返回失敗標(biāo)識(shí),結(jié)束。本實(shí)施中,失敗標(biāo)識(shí)可以是FALSE。步驟x3:第一函數(shù)查找和設(shè)備名相匹配的智能密鑰設(shè)備中是否存在和設(shè)備容器名相匹配的容器,如果是,則執(zhí)行步驟x4;否則,返回失敗標(biāo)識(shí),結(jié)束。具體地,獲取連接到主機(jī)的全部智能密鑰設(shè)備的設(shè)備信息,查找全部的智能密鑰設(shè)備中是否存在以設(shè)備容器名為容器名的容器,如果存在,則判斷存在和設(shè)備容器名相匹配的智能密鑰設(shè)備,否則,判斷不存在和設(shè)備容器名相匹配的智能密鑰設(shè)備。步驟x4:第一函數(shù)將和設(shè)備名相匹配的智能密鑰設(shè)備作為當(dāng)前設(shè)備,保存當(dāng)前設(shè)備ID;步驟x5:第一函數(shù)將一個(gè)無符號(hào)長整型數(shù)值設(shè)置為當(dāng)前設(shè)備容器私有CSP句柄,輸出當(dāng)前設(shè)備容器私有CSP句柄,返回成功標(biāo)識(shí),結(jié)束。本實(shí)施中,成功標(biāo)識(shí)可以是TRUE。步驟x6:第一函數(shù)檢查否存在和設(shè)備容器名相匹配的智能密鑰設(shè)備,如果是,則執(zhí)行步驟x7;否則,返回失敗標(biāo)識(shí),結(jié)束。步驟x7:第一函數(shù)判斷是否查找到唯一和設(shè)備容器名相匹配的智能密鑰設(shè)備,如果是,則執(zhí)行步驟x12;否則,執(zhí)行步驟x9;步驟x9:第一函數(shù)判斷是否需要輸出提示選擇智能密鑰設(shè)備信息,如果是,則執(zhí)行步驟x10;否則,執(zhí)行步驟x11;步驟x10:第一函數(shù)輸出需要用戶選擇智能密鑰設(shè)備的提示信息,將用戶選擇的智能密鑰設(shè)備作為當(dāng)前設(shè)備,保存當(dāng)前設(shè)備ID,返回步驟x5;步驟x11:第一函數(shù)將查找到的第一個(gè)和設(shè)備容器名相匹配的智能密鑰設(shè)備作為當(dāng)前設(shè)備,保存當(dāng)前設(shè)備ID,返回步驟x5;步驟x12:第一函數(shù)將唯一和設(shè)備容器名相匹配的智能密鑰設(shè)備作為當(dāng)前設(shè)備,保存當(dāng)前設(shè)備ID,返回步驟x5;步驟602:簽名程序判斷是否獲取到當(dāng)前設(shè)備容器私有CSP句柄,如果是,則執(zhí)行步驟603;否則,報(bào)錯(cuò)退出;具體地,簽名程序判斷得到的返回值是否為成功標(biāo)識(shí),如果是,則判斷獲取到當(dāng)前設(shè)備容器私有CSP句柄;否則,判斷沒有獲取到當(dāng)前設(shè)備容器私有CSP句柄,報(bào)錯(cuò)退出。本步驟中,簽名程序還可以根據(jù)獲取到的當(dāng)前設(shè)備容器私有CSP句柄是否為空來判斷是否獲取到當(dāng)前設(shè)備容器私有CSP句柄,如果獲取到的當(dāng)前設(shè)備容器私有CSP句柄不為空,則判斷獲取到當(dāng)前設(shè)備容器私有CSP句柄,如果獲取到的當(dāng)前設(shè)備容器私有CSP句柄為空,則判斷沒有獲取到中間件私有CSP句柄,報(bào)錯(cuò)退出。本實(shí)施例中,簽名程序根據(jù)獲取到的當(dāng)前設(shè)備容器私有CSP句柄可以定位到當(dāng)前設(shè)備中的容器名為國密密鑰容器名的容器。步驟603:簽名程序根據(jù)當(dāng)前設(shè)備容器私有CSP句柄和預(yù)設(shè)國密簽名算法標(biāo)識(shí)獲取當(dāng)前設(shè)備中的容器名為國密密鑰容器名的容器中的國密算法密鑰句柄;具體地,簽名程序調(diào)用主機(jī)操作系統(tǒng)第三接口函數(shù),將當(dāng)前設(shè)備容器私有CSP句柄和預(yù)設(shè)國密簽名算法標(biāo)識(shí)傳遞給中間件的第三函數(shù),獲取當(dāng)前設(shè)備中的容器名為國密密鑰容器名的容器中的國密算法密鑰句柄;本實(shí)施例中,第三接口函數(shù)可以是CryptGetUserKey函數(shù),第三函數(shù)可以是CPGetUserKey函數(shù)。本步驟中,簽名程序調(diào)用CryptGetUserKey函數(shù),將當(dāng)前密鑰容器私有CSP句柄和國密簽名算法標(biāo)識(shí)傳遞給相應(yīng)中間件的CPGetUserKey函數(shù),獲取國密算法密鑰句柄。需要說明的是,當(dāng)?shù)谌瘮?shù)獲取到當(dāng)前設(shè)備容器私有CSP句柄和國密用法密鑰算法標(biāo)識(shí)時(shí),第三函數(shù)根據(jù)當(dāng)前設(shè)備容器私有CSP句柄和國密用法密鑰算法標(biāo)識(shí)查找當(dāng)前設(shè)備中的容器名為國密密鑰容器名的容器中是否存在國密簽名算法密鑰,如果查找到,則將預(yù)設(shè)國密簽名算法密鑰句柄賦值給國密算法密鑰句柄,輸出國密算法密鑰句柄并返回成功標(biāo)識(shí);否則,返回失敗標(biāo)識(shí)。其中,預(yù)設(shè)國密簽名算法密鑰句柄是一個(gè)無符號(hào)長整型數(shù)值。步驟604:簽名程序判斷是否獲取到國密算法密鑰句柄,如果是,則執(zhí)行步驟605;否則,報(bào)錯(cuò)退出;具體地,簽名程序判斷獲取到國密算法密鑰句柄是否為空值,如果獲取到的國密算法密鑰句柄不為空值,則判斷獲取到國密算法密鑰句柄;否則,報(bào)錯(cuò)退出;本步驟中,簽名程序還可以根據(jù)得到的返回值是否為成功標(biāo)識(shí),判斷是否獲取到國密算法密鑰句柄,如果為成功標(biāo)識(shí),則判斷獲取國密算法密鑰句柄;否則,沒有獲取到國密算法密鑰句柄。步驟605:簽名程序根據(jù)當(dāng)前設(shè)備容器私有CSP句柄和國密算法密鑰句柄獲取當(dāng)前設(shè)備中的容器名為國密密鑰容器名的容器中的國密證書數(shù)據(jù);具體地,簽名程序調(diào)用主機(jī)操作系統(tǒng)第四接口函數(shù),將當(dāng)前設(shè)備容器私有CSP句柄和國密算法密鑰句柄傳遞給中間件的第四函數(shù),獲取國密證書數(shù)據(jù);本實(shí)施例中,第四接口函數(shù)可以是CryptGetKeyParam函數(shù),第四函數(shù)可以是CPGetKeyParam函數(shù)。需要說明的是,當(dāng)?shù)谒暮瘮?shù)獲取到當(dāng)前設(shè)備容器私有CSP句柄和國密算法密鑰句柄時(shí),第四函數(shù)查找到當(dāng)前設(shè)備中的容器名為國密密鑰容器名的容器,讀取容器中的國密證書數(shù)據(jù),判斷是否讀取到合法的國密證書數(shù)據(jù),如果是,則輸出國密證書數(shù)據(jù),并且返回成功標(biāo)識(shí);否則返回失敗標(biāo)識(shí)。步驟606:簽名程序判斷是否獲取到國密證書數(shù)據(jù),如果是,則執(zhí)行步驟607;否則,報(bào)錯(cuò)退出;具體地,簽名程序根據(jù)獲取到的國密證書數(shù)據(jù)是否不為空,且得到的返回值是否為成功標(biāo)識(shí),判斷獲取到國密證書數(shù)據(jù),根據(jù)得到的返回值為失敗標(biāo)識(shí),判斷沒有獲取到國密證書數(shù)據(jù)。步驟607:簽名程序根據(jù)國密證書數(shù)據(jù)獲取國密證書上下文結(jié)構(gòu)體;具體地,簽名程序調(diào)用主機(jī)操作系統(tǒng)的解析證書函數(shù),根據(jù)國密證書數(shù)據(jù)獲取國密證書上下文結(jié)構(gòu)體;本實(shí)施例中,解析證書函數(shù)可以是CertCreateCertificateContext函數(shù)。步驟608:簽名程序根據(jù)國密證書上下文結(jié)構(gòu)體獲取國密證書認(rèn)證信息;具體地,簽名程序調(diào)用主機(jī)操作系統(tǒng)的證書名轉(zhuǎn)換格式函數(shù),根據(jù)國密證書上下文結(jié)構(gòu)體獲取國密證書認(rèn)證信息;本實(shí)施例中,證書名轉(zhuǎn)換格式函數(shù)可以是CertNameToStr函數(shù)。本步驟中,簽名程序獲取到的國密證書認(rèn)證信息可以是國密證書的DN信息。例如,簽名程序根據(jù)國密證書上下文結(jié)構(gòu)體調(diào)用主機(jī)操作系統(tǒng)提供的CertNameToStr函數(shù)獲取國密證書的DN信息,獲取到DN信息中的CN屬性信息為“CN=TEST1”,將CN屬性信息作為國密證書認(rèn)證信息的標(biāo)識(shí)。步驟609:簽名程序判斷國密證書認(rèn)證信息是否和認(rèn)證信息相匹配,如果是,則執(zhí)行步驟610;否則,報(bào)錯(cuò)退出;具體地,簽名程序查找國密證書認(rèn)證信息的標(biāo)識(shí)中是否包含和認(rèn)證信息的標(biāo)識(shí)一致的標(biāo)識(shí)信息,如果是,則匹配;否則,不匹配。例如,若獲取到的國密證書認(rèn)證信息的標(biāo)識(shí)為“CN=TEST1”,認(rèn)證信息的標(biāo)識(shí)為“CN=TEST1”,簽名程序查找到國密證書認(rèn)證信息的標(biāo)識(shí)中包含和認(rèn)證信息的標(biāo)識(shí)一致的標(biāo)識(shí)信息,則判斷國密證書認(rèn)證信息和認(rèn)證信息相匹配,若獲取到的國密證書認(rèn)證信息的標(biāo)識(shí)為“CN=TEST2”,簽名程序查找國密證書認(rèn)證信息的標(biāo)識(shí)中不含有和認(rèn)證信息的標(biāo)識(shí)一致的標(biāo)識(shí)信息,則判斷國密證書認(rèn)證信息和認(rèn)證信息不匹配。步驟610:簽名程序獲取國密簽名數(shù)據(jù),向服務(wù)器返回國密簽名數(shù)據(jù)。本實(shí)施例中,簽名程序在執(zhí)行步驟601之前,簽名程序還可以執(zhí)行步驟t1,步驟t1:簽名程序根據(jù)私有CSP名和預(yù)設(shè)容器名獲取中間件私有CSP句柄;步驟t2:簽名程序判斷是否獲取到中間件私有CSP句柄,如果是,則執(zhí)行步驟t3;否則,報(bào)錯(cuò)退出;具體地,簽名程序判斷得到的返回值是否為成功標(biāo)識(shí),如果是,則判斷獲取到中間件私有CSP句柄;否則,判斷沒有獲取到中間件私有CSP句柄,報(bào)錯(cuò)退出。本步驟中,簽名程序還可以根據(jù)獲取到的中間件私有CSP句柄是否為空來判斷是否獲取到中間件私有CSP句柄,如果獲取到的中間件私有CSP句柄不為空,則判斷獲取到中間件私有CSP句柄,如果獲取到的中間件私有CSP句柄為空,則判斷沒有獲取到中間件私有CSP句柄,報(bào)錯(cuò)退出。本實(shí)施中,簽名程序根據(jù)獲取到的中間件私有CSP句柄可以定位到智能密鑰設(shè)備提供商提供的中間件。步驟t3:簽名程序設(shè)置當(dāng)前枚舉參數(shù)為第一枚舉算法參數(shù),調(diào)用主機(jī)操作系統(tǒng)的第二接口函數(shù),將中間件私有CSP句柄和當(dāng)前枚舉參數(shù)傳遞給中間件的第二函數(shù),枚舉中間件的預(yù)設(shè)算法列表,獲取中間件的預(yù)設(shè)算法列表中的第一算法標(biāo)識(shí);本實(shí)施例中,第二接口函數(shù)可以是CryptGetProvParam函數(shù),第二函數(shù)可以是CPGetProvParam函數(shù);中間件的預(yù)設(shè)算法列表中包括中間件支持的所有算法的算法標(biāo)識(shí)。其中,中間件的預(yù)設(shè)算法列表中的算法標(biāo)識(shí)可以是國密算法標(biāo)識(shí)、哈希算法標(biāo)識(shí)、RSA算法標(biāo)識(shí)等,其中,國密算法標(biāo)識(shí)可以是SM2_SIGN、SM2_KEYX,哈希算法標(biāo)識(shí)可以是SM3、MD5、SHA1,RSA算法標(biāo)識(shí)可以是RSA,需要說明的是,其中,SM2_SIGN是國密簽名算法標(biāo)識(shí),哈希算法標(biāo)識(shí)中的SM3是與國密簽名算法標(biāo)識(shí)SM2_SIGN相應(yīng)的摘要算法標(biāo)識(shí)。本步驟中,簽名程序設(shè)置第一枚舉算法參數(shù)包括設(shè)置第一枚舉算法類型參數(shù)和第一枚舉算法標(biāo)志位參數(shù),具體地,設(shè)置第一枚舉算法類型參數(shù)為PP_ENUMALGS或PP_ENUMALGS_EX,設(shè)置第一枚舉算法標(biāo)志位參數(shù)為CRYPT_FIRST。具體地,當(dāng)中間件的第二函數(shù)獲取到枚舉算法類型參數(shù)為PP_ENUMALGS或PP_ENUMALGS_EX,枚舉算法標(biāo)志位參數(shù)為CRYPT_FIRST時(shí),第二函數(shù)獲取預(yù)設(shè)算法列表中的第一個(gè)算法標(biāo)識(shí),復(fù)位計(jì)數(shù)器,判斷第一算法標(biāo)識(shí)是否存在,如果是,輸出第一算法標(biāo)識(shí)并返回成功標(biāo)識(shí);否則,返回失敗標(biāo)識(shí)。本實(shí)施例中,失敗標(biāo)識(shí)可以是FALSE,第二函數(shù)設(shè)置計(jì)數(shù)器初始值為0。步驟t4:簽名程序判斷是否獲取到中間件的預(yù)設(shè)算法列表中的第一算法標(biāo)識(shí),如果是,則將第一算法標(biāo)識(shí)作為當(dāng)前算法標(biāo)識(shí),執(zhí)行步驟t5;否則,報(bào)錯(cuò)退出;具體地,簽名程序根據(jù)獲取到的第一算法標(biāo)識(shí)不為空且得到的返回值為成功標(biāo)識(shí),判斷獲取到中間件的預(yù)設(shè)算法列表中的第一算法標(biāo)識(shí),根據(jù)得到的返回值為失敗標(biāo)識(shí),判斷沒有獲取到中間件的預(yù)設(shè)算法列表中的第一算法標(biāo)識(shí)。步驟t5:簽名程序設(shè)置當(dāng)前枚舉參數(shù)為第二枚舉算法參數(shù),調(diào)用主機(jī)操作系統(tǒng)的第二接口函數(shù),將中間件私有CS...
當(dāng)前第1頁1 2 3 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
通化县| 保德县| 东台市| 金沙县| 深圳市| 吉木乃县| 望城县| 吉木萨尔县| 昌都县| 鄂尔多斯市| 冷水江市| 龙里县| 沭阳县| 垫江县| 射洪县| 桂平市| 深圳市| 诸城市| 鄂托克前旗| 乌鲁木齐市| 绥德县| 上栗县| 哈巴河县| 万全县| 德化县| 南部县| 白沙| 涞水县| 肇州县| 海宁市| 凯里市| 墨江| 台东县| 股票| 印江| 南宁市| 科尔| 宁蒗| 清河县| 鱼台县| 开江县|