Свяжите закрытый ключ с сертификатом для PFXExportCertStoreEx - PullRequest
3 голосов
/ 15 апреля 2009

Я пытаюсь экспортировать сертификат в файл 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 ]

4 голосов
/ 15 апреля 2009

Видимо, 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 голосов
/ 01 марта 2015

Для потомков:

Проблема связана с вызовом CertAddCertificateContextToStore. Действительно, он не копирует свойство CERT_KEY_PROV_HANDLE_PROP_ID в следующий контекст. (этот факт отмечен в замечании)

Решение:

Заполните последний параметр дескриптором нового контекста и скопируйте свойство из старого контекста в следующий.

...