随笔 - 13  文章 - 36  trackbacks - 0
<2009年5月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

常用链接

留言簿(2)

随笔档案

友情链接

搜索

  •  

最新评论

阅读排行榜

评论排行榜

转自
http://www.infosecurity.org.cn/forum/thread.php?fid=11&page=1

Q:

有为usbkey写过csp的吗?请问如何实现用usbkey来保存证书?
csp的CPSetKeyParam()需要注意什么?(MSDN上的没看懂)是否需要设定PK_CERTIFICATE这个参数?

比如,需要将产生的证书存在D盘根目录下面(暂时代替usbkey),需要哪里设定?

A:

分别通过调用CryptSetKeyParam和CryptGetKeyParam来调用CSP实现的CPSetKeyParam和CPGetKeyParam
当dwParam为KP_CERTIFICATE时,CPGetKeyParam的pbData就是证书的DER编码值。

Q:

使用usbkey时,弹出了一个输入pin码的框,这个框应该是CPGenKey()时来弹出的吧?!

A:

在产生证书请求的时候,CSP产生一个新容器,然后在容器里产生密钥对,然后使用密钥对产生证书请求。安装证书的时候,找到对应的容器,在对应的位置写入证书。
PIN的输入框,通常是要进行一个要求验证PIN码才能正常完成的操作,而以前有没有输入过PIN的情况下弹出的。通常这些操作包括产生容器、产生密钥对、写入证书、签名、使用私钥解密等。PIN的输入框是由CSP的实现者实现的。据MSDN说如果CryptAcquireContext的dwFlags包括CRYPT_SILENT,则不能弹出PIN的输入框。

Q:

经过几天的试验,有些进展。在如下方面还是有些不明白:
1、申请证书时,是随机产生的一串id,作为密钥的容器名,并存在证书里面(猜测);安装证书时,在调用CAPI函数自动传进来的吧;如果不是这样,那先前的那个容器名怎么取得?
2、在使用证书进行加、解密、签名时,应该也是从证书里面取的密钥容器名吧
3、CA证书的一些Store和密钥容器理解上还是有些含糊
4、这个是以后的问题了:就是自己做一个应用软件,调用CAPI函数来使用已有的证书进行加、解密和签名。这个好像有好多帖子,到时候再一起讨论。
A:

容器名不会存在证书里的。
证书和CSP信息的关联是由证书库来关联的。

以xenroll产生证书请求和安装为例,大致过程是这样的:
产生证书请求时,通常先产生一个新的容器,在容器里产生一对密钥对,然后用该密钥对产生证书请求。接着产生一个假证书,该证书的签名只有几个字节,然后把CSP的相关信息保存在该证书对象的CERT_KEY_PROV_INFO_PROP_ID属性里,最后把该证书对象加入到请求证书库里。
安装证书时,在请求证书库里,根据公钥找到匹配的假证书,设置要安装的证书的对象的CERT_KEY_PROV_INFO_PROP_ID属性为请求证书库里相应证书的CERT_KEY_PROV_INFO_PROP_ID属性,并加入到个人证书库里。然后删掉请求证书库里的对应证书。如果发现是USBKEY的CSP,会把证书也写入到USBKEY中。

以后使用证书来解密、签名的时候,会在个人证书库里找到对应证书的CERT_KEY_PROV_INFO_PROP_ID属性,来获取CSP信息,调用CSP来解密、签名的。

posted on 2009-05-10 19:31 Alex-Lee 阅读(1137) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理