2012-05-29 173 views
2

我使用CertCreateSelfSignCertificate函數生成了自簽名證書。這產生一個PCCERT_CONTEXT。CryptoApi:導出沒有私鑰的證書?

我怎樣才能導出存儲在PCCERT_CONTEXT變量,只有公鑰證書?我想這樣做,將它發送給網絡中的其他方,這樣它們就能夠使用公鑰對消息進行加密。

我認爲這是一個直接的選擇,但它沒有。

回答

1

樣子你會需要先put將證書導入證書存儲區,然後使用PFXExportCertStoreEx傳球0(即不設置EXPORT_PRIVATE_KEYS)dwFlags中導出。

P.S.在處理加密庫時,沒有什麼比較直接的,無論是CryptAPI,JSSE,OpenSSL ......它總是一場噩夢。

+0

謝謝。在某種程度上,該功能可能會做我想要的。儘管如此,將整個商店導出爲pfx時,我只想導出具有相應公鑰的單個證書,但看起來並不乾淨,不太好。還有另外一條路要走。 – Erik

+0

好吧,這個想法是,無論如何你肯定會在某些商店中保存這個證書 - 否則你將失去私鑰。因此,一旦它在商店中,您可以從中導出證書。您不需要將整個商店導出爲pfx。 –

2

不需要pfx。

證書存在於結構CERT_CONTEXT內:只保存由構件指向的緩衝區的內容pbCertEncoded並且其長度爲所述構件cbCertEncoded的值。

而且,從該證書的公共密鑰是在CERT_CONTEXT結構直接存在:pCertInfo-> SubjectPublicKeyInfo進行。例如,您可以使用CryptImportPublicKeyInfo,可以導入,然後調用CryptEncrypt對數據進行加密。

了這兩個選項,你都需要什麼來開始加密的消息。當然,私鑰必須是安全的,才能解密加密的數據。

+0

我也可以使用CryptSignAndEncryptMessage並將公鑰信息作爲收件人蔘數傳遞嗎?我想我需要以某種方式將公鑰信息轉換爲CERT_CONTEXT? – Erik

+0

@Erik:Mounir有權利。 *私人*鍵分別保存。如果你只是拯救'pbCertEncoded'文件中啓動'cbCertEncoded'字節,你會得到擴展.CER那麼其他的就可以使用您的證書,但他們將獲得其保存在密鑰容器私鑰無法訪問。 – Oleg