цепочка экспортных и импортных сертификатов

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

создание хранилища памяти — CertOpenStore

Открыть системный магазин — CertOpenSystemStore

найти нужный сертификат по доброжелательному имени —
CertFindCertificateInStore

Добавить нужный сертификат в хранилище памяти — CertAddCertificateContextToStore

экспорт памяти магазина — PFXExportCertStoreEx

конвертировать BLOB-объекты в base64 и сохранить в файл

Цепочка импорта сертификатов из файла PEM — файл SSL_CTX_use_certificate_chain_file

Импортировать закрытый ключ из файла PEM — SSL_CTX_use_PrivateKey_file

1) Я не нашел команду, которая конвертирует pfx (память, блоб / файл) в формат pem

2) экспортирует ли этот сценарий всю цепочку сертификатов, изначально сохраненную в файле pfx

3) импортирует ли SSL_CTX_use_certificate_chain_file всю цепочку сертификатов или мне нужно использовать другие команды для импорта всей цепочки в структуру CTX

заранее спасибо

0

Решение

1) Это сработало для меня

{
FILE* fp = NULL;
CString errorS = NULL;
PKCS12* p12 = NULL;
EVP_PKEY* pkey = NULL;
X509* cert = NULL;
STACK_OF(X509) *ca = NULL;

int i;
pkey = (EVP_PKEY*)new EVP_PKEY;
cert = (X509*)new X509;

do
{
if (fopen_s(&fp, CT2A(pkcs12File), "rb"))
{
errorS = ("Error opening file %s\n", CT2A(pkcs12File));
break;
}
p12 = d2i_PKCS12_fp(fp, NULL);
OpenSSL_add_all_algorithms();
ERR_load_crypto_strings();
if (!p12)
{
errorS = ("Error reading PKCS#12 file\n");
break;
}
if (!PKCS12_parse(p12, CT2A(szPassword), &pkey, &cert, &ca))
{
errorS = ("Error parsing PKCS#12 file\n");
break;
}

if (fopen_s(&fp, CT2A(pszNameString + L".pem"), "w"))
{
errorS = ("Error opening file %s\n", CT2A(pemFileName));
break;
}
if (pkey)
{
fprintf(fp, "***Private Key***\n");
PEM_write_PrivateKey(fp, pkey, NULL, NULL, 0, NULL, NULL);
}
if (cert)
{
fprintf(fp, "***User Certificate***\n");
PEM_write_X509_AUX(fp, cert);
}
if (ca && sk_X509_num(ca))
{
fprintf(fp, "***Other Certificates***\n");
for (i = 0; i < sk_X509_num(ca); i++)
PEM_write_X509_AUX(fp, sk_X509_value(ca, i));
}
} while (0);

PKCS12_free(p12);
sk_X509_pop_free(ca, X509_free);
X509_free(cert);
EVP_PKEY_free(pkey);

if (NULL != fp)
{
fclose(fp);
}
}

2 + 3) SSL_CTX_use_certificate_chain_file импортировать все цепочки сертификатов

0

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

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

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