2009-04-14 6 views
2

J'essaie d'exporter un certificat vers un fichier pfx. Voici ce que je fais (simplifié):Associer une clé privée au certificat pour 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 créé, aucune clé privée exportée. Quelqu'un a jamais exporté la clé privée de pfx? Quelle est la bonne façon d'attacher une clé privée au certificat afin qu'elle puisse être exportée?

Répondre

4

Apparemment, CertSetCertificateContextProperty(p, CERT_KEY_PROV_HANDLE_PROP_ID ...)

est pas bon. Vous avez besoin de le faire à la place:

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

Il est essentiel que le nom du fournisseur et d'autres conneries correspondent aux informations qui a été utilisé pour générer la clé réelle. Il n'est pas nécessaire de définir le gestionnaire du fournisseur ou l'un de ces éléments. Il doit également être fait avant CertAddCertificateContextToStore.

C'est la seule façon que j'ai trouvé pour attacher une clé privée à un certificat.

+0

Cela m'a vraiment aidé. Mais lorsque j'importe une CA tierce qui utilise PFXImportCertStore, la clé est automatiquement mappée à AT_KEYEXCHANGE plutôt qu'à AT_SIGNATURE-, car l'utilisation de ce certificat indique qu'il s'agit de signature numérique, de chiffrement de clé, etc., avez-vous surmonté ces problèmes? Merci – Raj

+0

@Raj, désolé, je ne me souviens pas si je l'ai fait et comment ... Il y a quelque temps, je m'excuse – galets

+0

merci beaucoup! Je cherchais une solution pour toute une journée! –

0

Pour la postérité:

Le problème est lié à l'appel CertAddCertificateContextToStore. En effet, il ne copie pas la propriété CERT_KEY_PROV_HANDLE_PROP_ID dans le contexte suivant. (Ce fait est noté dans la remarque)

Solution:

Remplissez le dernier paramètre avec une poignée au nouveau contexte et copie la propriété de l'ancien cadre à la suivante.