轉(zhuǎn)自
http://www.infosecurity.org.cn/forum/thread.php?fid=11&page=1
Q:
有為usbkey寫過csp的嗎?請問如何實現(xiàn)用usbkey來保存證書?
csp的CPSetKeyParam()需要注意什么?(MSDN上的沒看懂)是否需要設(shè)定PK_CERTIFICATE這個參數(shù)?
比如,需要將產(chǎn)生的證書存在D盤根目錄下面(暫時代替usbkey),需要哪里設(shè)定?
A:
分別通過調(diào)用CryptSetKeyParam和CryptGetKeyParam來調(diào)用CSP實現(xiàn)的CPSetKeyParam和CPGetKeyParam
當(dāng)dwParam為KP_CERTIFICATE時,CPGetKeyParam的pbData就是證書的DER編碼值。
Q:
使用usbkey時,彈出了一個輸入pin碼的框,這個框應(yīng)該是CPGenKey()時來彈出的吧?!
A:
在產(chǎn)生證書請求的時候,CSP產(chǎn)生一個新容器,然后在容器里產(chǎn)生密鑰對,然后使用密鑰對產(chǎn)生證書請求。安裝證書的時候,找到對應(yīng)的容器,在對應(yīng)的位置寫入證書。
PIN的輸入框,通常是要進(jìn)行一個要求驗證PIN碼才能正常完成的操作,而以前有沒有輸入過PIN的情況下彈出的。通常這些操作包括產(chǎn)生容器、產(chǎn)生密鑰對、寫入證書、簽名、使用私鑰解密等。PIN的輸入框是由CSP的實現(xiàn)者實現(xiàn)的。據(jù)MSDN說如果CryptAcquireContext的dwFlags包括CRYPT_SILENT,則不能彈出PIN的輸入框。
Q:
經(jīng)過幾天的試驗,有些進(jìn)展。在如下方面還是有些不明白:
1、申請證書時,是隨機(jī)產(chǎn)生的一串id,作為密鑰的容器名,并存在證書里面(猜測);安裝證書時,在調(diào)用CAPI函數(shù)自動傳進(jìn)來的吧;如果不是這樣,那先前的那個容器名怎么取得?
2、在使用證書進(jìn)行加、解密、簽名時,應(yīng)該也是從證書里面取的密鑰容器名吧
3、CA證書的一些Store和密鑰容器理解上還是有些含糊
4、這個是以后的問題了:就是自己做一個應(yīng)用軟件,調(diào)用CAPI函數(shù)來使用已有的證書進(jìn)行加、解密和簽名。這個好像有好多帖子,到時候再一起討論。
A:
容器名不會存在證書里的。
證書和CSP信息的關(guān)聯(lián)是由證書庫來關(guān)聯(lián)的。
以xenroll產(chǎn)生證書請求和安裝為例,大致過程是這樣的:
產(chǎn)生證書請求時,通常先產(chǎn)生一個新的容器,在容器里產(chǎn)生一對密鑰對,然后用該密鑰對產(chǎn)生證書請求。接著產(chǎn)生一個假證書,該證書的簽名只有幾個字節(jié),然后把CSP的相關(guān)信息保存在該證書對象的CERT_KEY_PROV_INFO_PROP_ID屬性里,最后把該證書對象加入到請求證書庫里。
安裝證書時,在請求證書庫里,根據(jù)公鑰找到匹配的假證書,設(shè)置要安裝的證書的對象的CERT_KEY_PROV_INFO_PROP_ID屬性為請求證書庫里相應(yīng)證書的CERT_KEY_PROV_INFO_PROP_ID屬性,并加入到個人證書庫里。然后刪掉請求證書庫里的對應(yīng)證書。如果發(fā)現(xiàn)是USBKEY的CSP,會把證書也寫入到USBKEY中。
以后使用證書來解密、簽名的時候,會在個人證書庫里找到對應(yīng)證書的CERT_KEY_PROV_INFO_PROP_ID屬性,來獲取CSP信息,調(diào)用CSP來解密、簽名的。
posted on 2009-05-10 19:31
Alex-Lee 閱讀(1190)
評論(0) 編輯 收藏 引用