使用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);
要重新添加证书...所以我的问题是,为什么不保留私钥?我想念什么吗?     
已邀请:
您使用了错误的CryptoAPI。您应该改用PFXExportCertStoreEx和PFXImportCertStore。 更新:这些功能非常常见。您当然不能从SmartCard导出证书或其他不可导出的证书。该函数中的BLOG仅包含PFX文件。例如,从PFX文件导入证书应执行以下操作: 打开PFX文件并读取内存中的全部包含。当然,您可以使用文件映射。 (可选)您可以使用
PFXIsPFXBlob
函数来验证文件中是否确实包含与PFX文件相对应的文件。 使用
PFXImportCertStore
打开BLOB(PFX)作为源证书存储。 您可以使用ѭ5或其他功能打开要从PFX文件中保存证书的目标证书存储。 使用
CertEnumCertificatesInStore
枚举源证书存储(PFX)中的证书,对于所有证书,请使用
CertAddCertificateContextToStore
将证书从源证书存储添加到目标证书存储中。具有私钥的证书将与私钥一起导入。 您使用
CertCloseStore
关闭两个已打开的商店。     

要回复问题请先登录注册