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来解密、签名的。