2009-04-14 38 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屬性複製到下一個上下文。 (這其實是在備註說明)

解決方案:

填寫的最後一個參數帶有把手的新情況和財產從舊的上下文複製到下一個。