将私钥与PFXExportCertStoreEx的证书相关联

时间:2009-04-14 22:56:32

标签: cryptoapi pfx

我正在尝试将证书导出到pfx文件。这就是我所做的(简化):

h = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, NULL, CERT_STORE_CREATE_NEW_FLAG, NULL); 
p = CertCreateCertificateContext(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
                  CertBlob.pbData, CertBlob.cbData);
CertSetCertificateContextProperty(p, CERT_KEY_PROV_HANDLE_PROP_ID, 0, &hPrivKey);
CertAddCertificateContextToStore(h, p, CERT_STORE_ADD_ALWAYS, NULL);
PFXExportCertStoreEx(h, &SomeBlob, L"", NULL, EXPORT_PRIVATE_KEYS);

创建了PFX,没有导出私钥。有人曾将私钥导出到pfx吗?将私钥附加到证书以便将其导出的正确方法是什么?

2 个答案:

答案 0 :(得分:4)

显然,CertSetCertificateContextProperty(p, CERT_KEY_PROV_HANDLE_PROP_ID ...)

不好。需要这样做:

CRYPT_KEY_PROV_INFO kpi;
ZeroMemory( & kpi, sizeof(kpi) );
kpi.pwszContainerName = "my-container-name";
kpi.dwProvType = PROV_RSA_FULL;
kpi.dwKeySpec = AT_KEYEXCHANGE;
kpi.dwFlags = CRYPT_MACHINE_KEYSET;
CertSetCertificateContextProperty( pCert, CERT_KEY_PROV_INFO_PROP_ID, 0, & kpi);

提供者名称和其他垃圾与用于生成实际密钥的信息相匹配至关重要。不需要设置提供者句柄或任何这些东西。它也必须在CertAddCertificateContextToStore之前完成。

这是我发现将私钥附加到证书的唯一方法。

答案 1 :(得分:0)

后人:

问题与CertAddCertificateContextToStore电话有关。 实际上,它不会将CERT_KEY_PROV_HANDLE_PROP_ID属性复制到下一个上下文。 (这一事实在评论中注明)

<强>解决方案:

使用新上下文的句柄填充最后一个参数,并将属性从旧上下文复制到下一个。