Экспортируйте файл pfx с закрытым ключом в файл, используя capi

Следующий Экспорт файла PFX из хранилища сертификатов Windows

Я пытаюсь экспортировать из хранилища ключей Windows файл pfx, который содержит как сертификат, так и закрытый ключ, и выгрузить его в файл формата PEM, который должен быть прочитан openssl.

Закрытый ключ был помечен как экспортируемый во время импорта файла в WCS

Я копаю большинство вопросов здесь, которые касаются извлечения сертификата, но ни один из них не касается файла pfx, который также включает в себя закрытый ключ, или они используют инструмент, например. mmc и т. д., и я должен кодировать его как часть приложения на C ++.

Основная проблема после экспорта сертификата из WCS заключается в разделении сертификата и раздела закрытого ключа перед преобразованием их из двоичного формата в кодировку base64 (необходимо добавить заголовок раздела и трейлер) и, возможно, также в преобразование из pfx в PEM.

В примере MS, в котором мой код основан на сертификате, был сериализован, а в других примерах — нет.

Мне также посоветовали импортировать экспортированный сертификат в новое «виртуальное» хранилище, но я не понимаю, почему.

Для меня важно экспортировать как сертификат, так и закрытый ключ из WCS для форматирования и размещения, из которого openssl может импортировать их.

Если у кого-то есть другой способ сделать это, я буду благодарен за любую информацию.
Заранее спасибо за все комментарии / ответы.

Мой код:

//-----------------------------------------

#pragma comment(lib, "crypt32.lib")

#include <stdio.h>
#include <windows.h>
#include <Wincrypt.h>
#define MY_ENCODING_TYPE  (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
void MyHandleError(char *s);

char *base64_encode(const unsigned char *data,
size_t input_length,
size_t *output_length);

void main(void)
{
//-------------------------------------------------------------------
// Declare and initialize variables.
HCERTSTORE         hSystemStore;
PCCERT_CONTEXT     pCertContext = NULL;
char pszStoreName[256] = "root";
char               pszNameString[256] = "CARootTest";
char*              pbElement;
size_t              cbElement;
//-------------------------------------------------------------------
// Open a system certificate store.
if(hSystemStore = CertOpenSystemStore(
0,
pszStoreName))
{
printf("The %s system store is open. Continue.\n", pszStoreName );
}
else
{
MyHandleError("The first system store did not open.");
}
//-------------------------------------------------------------------
// Get a certificate that has the desired friendly name.
if(pCertContext=CertFindCertificateInStore(
hSystemStore,
MY_ENCODING_TYPE,             // Use X509_ASN_ENCODING
0,                            // No dwFlags needed
CERT_NAME_FRIENDLY_DISPLAY_TYPE,        // Find a certificate
pszNameString, // The Unicode string to be found
// in a certificate's subject
NULL))                        // NULL for the first call
{
printf("The %s certificate was found. \n", pszNameString);
}
else
{
MyHandleError("Could not find the %s certificate.");
}

pbElement = base64_encode(pCertContext->pbCertEncoded,
sizeof (pCertContext->pbCertEncoded),
&cbElement);
/*
//-------------------------------------------------------------------
//  pbElement could be written to a file ??

FILE *fp;
errno_t err;
if ((err = fopen_s(&fp, "cert.p12", "w")) != 0)
printf("File was not opened\n");
else
fprintf(fp, "%s", pbElement);
fclose(fp);

//-------------------------------------------------------------------
// Free memory.

free(pbElement);
CertCloseStore(hSystemStore,0);
printf("The program ran without error to the end.\n");
} // End of main

//-------------------------------------------------------------------
void MyHandleError(char *s)
{
fprintf(stderr,"An error occurred in running the program. \n");
fprintf(stderr,"%s\n",s);
fprintf(stderr, "Error number %x.\n", GetLastError());
fprintf(stderr, "Program terminating. \n");
exit(1);
} // End of MyHandleError

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]