CAPI写密钥对到USBKey CSP中

在前面了解了CryptoAPI和CSP的相关概念之后,我们具体分析了CryptoAPI的相关函数,实现了写证书、私钥的过程和更新证书的过程。
写证书和私钥到CSP的方案:
首 先将CA返回给RA的证书和私钥进行封装,将它们封装成P12结构证书,然后将P12结构证书导入到一个临时的证书库中。在该临时库中找到证书的上下文, 通过证书上下文获得一个临时的CSP句柄和证书对应的私钥的类型,然后根据这个CSP句柄和私钥类型获得对应的私钥句柄。利用前面得到的CSP句柄和私钥 句柄将私钥以PRIVATEKEYBLOB的形式从CSP导出来。利用CryptAcquireContext函数创建一个密钥容器并获得USBKey CSP的句柄,然后将前面导出来的blob形式的私钥导入USBKey CSP的密钥容器中,同时获得了该密钥容器中的私钥的句柄。通过该私钥句柄将对应的证书写进密钥容器中,从而完成了证书和私钥的写入。
具体过程实现如下:
(1) 将CA返回给RA的证书和私钥进行封装,将它们封装成P12结构证书。
(2) 利用PFXImportCertStore函数将P12结构证书导入一个临时的内存型证书库,并获得该库的句柄hImportStore。
(3) 利用CertFindCertificateInStore函数获得hImportStore.证书库中的证书上下文pCertContext。
(4) 利用上面得到的证书上文pCertContext,通过CryptAcquireCertificatePrivateKey函数获得临时CSP句柄hCryptProv,证书对应私钥的类型dwKeySpec。
(5) 利用临时CSP句柄hCryptProv,私钥的类型dwKeySpec,通过CryptGetUserKey获得证书对应的私钥句柄hUserKey。
(6) 利用私钥句柄hUserKey,通过CryptExportKey将私钥以PRIVATEKEYBLOB的形式导出来,获得私钥的blob和长度。
(7) 通过CryptAcquireContext函数,创建密钥容器并获得USBKey CSP的句柄hProv。
(8) 利用获得hProv和上面获得的私钥blob和长度,通过CryptImportKey函数将私钥导进USBKey CSP中,并返回私钥句柄hKey。
(9) 利用私钥句柄hKey,和前面获得的证书上下文pCertContext的内容,通过CryptSetKeyParam函数将证书写进对应的密钥容器。
(10) 到此为止,已经实现了将证书和私钥写进USBKey CSP的过程。
证书更新的过程方案:
CA 将更新后的证书发给RA,RA用证书更新前的序列号去查找系统库中对应的证书,找到该证书之后,利用该证书上下文获得USBKey CSP句柄和密钥类型,从而获得要更新证书对应的私钥句柄。利用获得的私钥句柄,将更新的证书写入私钥对应的密钥容器中,从而完成证书更新过程。为了防止 系统库中有多个CA中心颁发的相同序列号的证书,在RA查找到了相同序列号的证书后,再将已经更新的证书和找到的证书的AKID(颁发者密钥标识符)进行 比较,如果两者相同,说明找到要更新的证书,如果没有,则继续查找。
具体实现的过程如下:
(1) 通过CryptAcquireContext函数获得USBKey CSP句柄hProv。
(2) 利用hProv,通过CertOpenStore函数打开系统库,获得系统库句柄hCertStore。
(3) 利用hCertStore,通过CertEnumCertificatesInStore函数枚举证书库中的证书上下文,获得了证书上下文 (pCertContext)后,取出对应的证书序列号与RA处给的序列号,如果相同,就再将更新的证书与这个证书上下文的AKID进行比较,如果仍然相 同,则认为找到要进行更新的证书。反之则继续查找。同时释放USBKey CSP句柄hProv。
(4) 利用pCertContext,通过CryptAcquireCertificatePrivateKey函数获得USBKey CSP句柄hProv,证书对应私钥的类型dwKeySpec。
(5) 利用临时CSP句柄hProv,私钥的类型dwKeySpec,通过CryptGetUserKey获得证书对应的私钥句柄hUserKey。
(6) 利用私钥句柄hUserKey和更新的证书,通过CryptSetKeyParam函数将更新证书写进对应的密钥容器。
(7) 至此,完成了证书更新的过程。
    上面的开发平台是Win2000+VC.6.0。用微软的证书服务机构颁发的证书进行了上面方案的测试,写入的证书和私钥在安全web站点访问、安全电子邮件测试中均通过,说明该方案是可行的。

时间: 2024-11-10 13:04:44

CAPI写密钥对到USBKey CSP中的相关文章

Android -- 写xml到SD卡中

信息类                                                                                          private String body; private String number; private int type; private long id; 四个变量,然后有分别set和get.构造函数分别初始化这四个变量. 生成xml标签函数                                   

自己写的程序在OS中运行 杂想

搞嵌入式的同学问:怎么把自己的程序放到OS中? 程序放到OS中,回想一下自己学过的操作系统课程.学了一堆的进程调度.文件系统.是的,自己的操作系统学的都是怎么设计操作系统但是貌似没说明怎么将自己写的程序放到OS中. 首先Linux和Mac O都不熟悉,我回想一下Windows过程中程序的运行.安装-运行,就这么简单. 再想一下,在OS运行的过程中是一个死循环.那么在循环中应该有一个操作是专门监听事件的变动的------HOOK?应该就是想HOOK这种. 那么安装的时候也就是说: 1.我把程序的配

Delphi写的DLL,OCX中多线程一个同步问题

Delphi写的DLL,OCX中如果使用了TThread.Synchronze(Proc),可能导致线程死锁,原因是无法唤醒EXE中主线程, Synchronze并不会进入EXE主线程消息队列. 下面的程序自动解决此问题,只需要加入DLL,OCX工程文件中,在DLL,OCX中便可以使用TThread.Synchronze(Proc)了,无需再写一行代码. //解决Delphi编译的DLL,OCX文件中的线程调用 TThread.Synchronize后挂起无法再激活问题 //调用了TThread

JAVA写个东西读取TXT中的数据 且要计算出平均值和总值 最后还要按总值排序

AVA写个东西读取TXT中的数据 且要计算出平均值和总值 最后还要按总值排序 例如:要计算a.txt文档中内容可如下: 学号 姓名    语文 数学 英语 平均值 总值 排序 1    肯德基   90   98   97 2    经典款   98   97   92 3    肯德的   93   92   97 import java.io.*; import java.io.File; import java.util.ArrayList; import java.util.Iterat

自己写的一个类似于jQuery中的toggle函数

这是HTML <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>公共测试页</title> <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script> <script ty

如何利用JLINK烧写U-boot到NAND Flash中

原文:http://blog.csdn.net/yanghao23/article/details/7689534  很多同学使用笔记本作为自己的ARM开发和学习的平台,绝大多数笔记本都没有并口,也就是无法使用JTag调试和烧写程序到Nand Flash中,幸好我们还有JLINK,用JLINK烧写U-boot到Nor Flash中很简单,大部分NOR Flash都已经被JLink的软件SEGGER所支持,而新手在学习的时候经常会实验各种各样的命令,最悲剧的莫过于将NAND Flash中原有的bo

写一个函数实现数组中的元素随机乱序排序

//原生JS写一个函数实现一个shuffle方法,将数组中的元素随机乱序排序 var shuffle = function(arr){ var len,t,rand; for(var i =0;len = arr.length,i<len;i++){ rand = parseInt(Math.random()*len);//parseInt(Math.random()*(len-1-0)+1);或者rand = Math.floor(Math.random()*(len-1-0)+1);即Mat

77)PHP,将session数据写到不用的存储介质中

首先我的siession数据可以写到:文件中    session数据区  或者数据库中, 那么怎么将文件中的session数据或者session数据区的数据写到  数据库中,,又或者任意挑选两个不同的介质互写, 所以也就是重写session的存储机制. 目的: ①便于管理大量的session数据 ②便于Web服务器集群(就是多个apache服务器,因为一台可能不够用)共享session数据.(其实可以有一台专门存储session数据的服务器,然后有多台Web服务器,这样多个Web服务器共享概念

嵌入式css样式,写在当前的文件中

现在有一任务,把下面的“超酷的互联网”.“服务及时贴心”.“有趣易学”这三个短词文字字号修改为18px. 如果用内联式css样式的方法进行设置将是一件很头疼的事情(为每一个<span>标签加入sytle="font-size:18px"语句),现在讲解一种新的方法嵌入式css样式来实现这个任务. 嵌入式css样式,就是可以把css样式代码写在<style type="text/css"></style>标签之间.如下面代码实现把三