2009-04-14 58 views
2

我试图将证书导出到pfx文件。这里是我做的(简化):将私钥与PFXExportCertStoreEx的证书相关联

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?将私钥附加到证书的正确方法是什么,以便将其导出?

回答

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之前完成。

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

+0

这真的帮了我。但是,当我使用PFXImportCertStore导入第三方CA发布的PFX时,密钥会自动映射到AT_KEYEXCHANGE而不是AT_SIGNATURE-,因为此证书的密钥用法表示它用于数字签名,密钥加密等,您是否克服了这些问题?谢谢 – Raj 2011-06-11 10:14:04

0

为后人:

的问题是关系到CertAddCertificateContextToStore通话。 确实,它不会将CERT_KEY_PROV_HANDLE_PROP_ID属性复制到下一个上下文。 (这其实是在备注说明)

解决方案:

填写的最后一个参数带有把手的新情况和财产从旧的上下文复制到下一个。