2012-05-29 126 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