2009-04-14 5 views
2

Ich versuche Zertifikat in PFX-Datei zu exportieren. Hier ist, was ich mache (vereinfacht):Associate privaten Schlüssel zu Zertifikat für 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 erstellt, kein privater Schlüssel exportiert. Wer hat jemals einen privaten Schlüssel zu pfx exportiert? Was ist der richtige Weg, um einen privaten Schlüssel an das Zertifikat anzuhängen, damit es exportiert werden kann? Offenbar

Antwort

4

, CertSetCertificateContextProperty(p, CERT_KEY_PROV_HANDLE_PROP_ID ...)

ist nicht gut. Benötigen Sie diese stattdessen tun:

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); 

Es ist wichtig, dass Provider-Name und anderer Mist mit den Informationen übereinstimmen, die verwendet wurde eigentliche Schlüssel zu generieren. Es ist nicht erforderlich, Provider-Handle oder irgendetwas davon einzustellen. Es muss auch vor CertAddCertificateContextToStore erfolgen.

Dies ist die einzige Möglichkeit, einen privaten Schlüssel an ein Zertifikat anzuhängen.

+0

Das hat mir wirklich geholfen. Aber wenn ich eine Drittanbieter-CA PFX mithilfe von PFXImportCertStore importiere, wird der Schlüssel automatisch AT_KEYEXCHANGE zugewiesen und nicht AT_SIGNATURE-, da die Schlüsselverwendung dieses Zertifikats darauf hinweist, dass es sich um digitale Signatur, Schlüsselverschlüsselung usw. handelt. Haben Sie solche Probleme überwunden? Danke – Raj

+0

@Raj, sorry, ich erinnere mich nicht, wenn ich tat und wie ... Es war vor einer Weile, ich entschuldige mich – galets

+0

vielen Dank! Ich war auf der Suche nach einer Lösung für einen ganzen Tag! –

0

Für die Nachwelt:

Das Problem mit dem CertAddCertificateContextToStore Anruf in Beziehung steht. Tatsächlich wird die Eigenschaft CERT_KEY_PROV_HANDLE_PROP_ID nicht in den nächsten Kontext kopiert. (Diese Tatsache wird in der Bemerkung angegeben)

Lösung:

Füllen Sie die letzten Parameter mit einem Griff an den neuen Kontext und kopieren Sie die Eigenschaft aus dem alten Kontext zum nächsten.