使用MS CryptoAPI保存/恢复证书使连接的私钥失效

我写了一个程序,应该使用Windows Crypto API保存和恢复用户证书。 我的印象是,它工作正常,但现在用户抱怨说,证书已被恢复后,附加到证书的私钥是无效的。

我正在使用以下方式保存证书:

HCERTSTORE hCertStore = CertOpenStore(CERT_STORE_PROV_PHYSICAL_W, 0, NULL, CERT_SYSTEM_STORE_CURRENT_USER | CERT_STORE_OPEN_EXISTING_FLAG | CERT_STORE_READONLY_FLAG | CERT_STORE_UPDATE_KEYID_FLAG, (PVOID) storeName.c_str()); 

再后来:

 if (!CertSaveStore(hCertStore, 0, CERT_STORE_SAVE_AS_STORE, CERT_STORE_SAVE_TO_FILENAME, (PVOID) saveFile.c_str(), 0)) 

我明白,CERT_STORE_SAVE_AS_STORE标志应该意味着整个证书应该被序列化,包括私钥。 虽然我注意到MSDN说:

“CERT_KEY_CONTEXT_PROP_ID属性和相关的CERT_KEY_PROV_HANDLE_PROP_ID和CERT_KEY_SPEC_PROP_ID值不会被保存到序列化的商店”。

..我承认,我真的不明白。

当我恢复证书时,我使用CertFindCertificateInStore()来查看证书是否已经存在,只有当证书不存在时,我才会这样做:

 bOK = CertAddCertificateContextToStore( hDestinationStore, pCertContext, CERT_STORE_ADD_USE_EXISTING, NULL); 

为了添加证书…所以我的问题是,为什么私钥不能被保存? 我错过了什么吗?

Solutions Collecting From Web of "使用MS CryptoAPI保存/恢复证书使连接的私钥失效"

您使用错误的CryptoAPI。 您应该改用PFXExportCertStoreEx和PFXImportCertStore 。

更新 :功能是非常普遍的。 您当然不能从智能卡导出证书,也不能导出其他不可导出的证书。 函数中的BLOG不过是PFX文件的内容。 例如,从PFX文件导入证书应执行以下操作:

  1. 打开PFX文件并读取内存中的完整内容。 您当然可以使用文件映射。
  2. 或者,您可以使用PFXIsPFXBlob函数来验证文件是否确实包含与PFX文件相对应的文件。
  3. 您使用PFXImportCertStore打开作为源证书存储的BLOB(PFX)。
  4. 您可以使用CertOpenStore或其他某些功能来打开您要从PFX文件中保存证书的目标证书存储区。
  5. 使用CertEnumCertificatesInStore枚举源证书存储区(PFX)中的证书,并使用CertAddCertificateContextToStore将所有证书从源证书存储区添加到目标证书存储区。 具有私钥的证书将与私钥一起导入。
  6. 您使用CertCloseStore关闭两个打开的商店。