Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 进出口证书链_C++_Windows_Openssl_Pem_Pfx - Fatal编程技术网

C++ 进出口证书链

C++ 进出口证书链,c++,windows,openssl,pem,pfx,C++,Windows,Openssl,Pem,Pfx,我尝试从windows证书库导出包含证书链和私钥的pfx文件,将oit转换为PEM格式,并将其保存到基于openssl的应用程序可以读取的文件中。 我通过以下步骤(capi/openssl命令)完成此操作: 创建内存存储-CertOpenStore 开放系统存储-CertOpenSystemStore 根据freindly名称查找所需证书- CertFindCertificateInStore 将所需证书添加到内存存储-CertAddCertificateContextToStore 导出内存存

我尝试从windows证书库导出包含证书链和私钥的pfx文件,将oit转换为PEM格式,并将其保存到基于openssl的应用程序可以读取的文件中。 我通过以下步骤(capi/openssl命令)完成此操作:

创建内存存储-CertOpenStore

开放系统存储-CertOpenSystemStore

根据freindly名称查找所需证书- CertFindCertificateInStore

将所需证书添加到内存存储-CertAddCertificateContextToStore

导出内存存储-pfxexportcertstorex

将blob转换为base64并保存到文件中

从PEM文件导入证书链-SSL\u CTX\u使用\u证书\u链\u文件

从PEM文件导入私钥-SSL\u CTX\u使用\u私钥\u文件

1) 我没有找到将pfx(内存块/文件)转换为pem格式的命令

2) 此方案是否导出最初存储在pfx文件中的所有证书链

3) SSL_CTX_是否使用_certificate_chain_文件导入所有证书链,或者我必须使用其他命令将所有链导入CTX结构

提前谢谢这对我来说很有效

{
    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);
    }
}
{
FILE*fp=NULL;
CString errorS=NULL;
PKCS12*p12=NULL;
EVP_PKEY*PKEY=NULL;
X509*证书=空;
(X509)*ca的栈_=NULL;
int i;
pkey=(执行副总裁*)新执行副总裁;
证书=(X509*)新X509;
做
{
if(fopen_s(&fp,CT2A(PKCS12文件),“rb”))
{
错误=(“打开文件%s\n”时出错,CT2A(pkcs12File));
打破
}
p12=d2i_PKCS12_fp(fp,NULL);
OpenSSL_添加_所有算法();
错误加载加密字符串();
如果(!p12)
{
错误=(“读取PKCS#12文件时出错”);
打破
}
如果(!PKCS12_parse(p12,CT2A(szPassword),&pkey,&cert,&ca))
{
errorS=(“解析PKCS#12文件时出错\n”);
打破
}
如果(fopen_s(&fp,CT2A(pszNameString+L“.pem”),“w”))
{
错误=(“打开文件%s\n”时出错,CT2A(文件名));
打破
}
如果(pkey)
{
fprintf(fp,***私钥***\n”);
PEM_write_PrivateKey(fp,pkey,NULL,NULL,0,NULL,NULL);
}
如果(证书)
{
fprintf(fp,***用户证书***\n”);
PEM_write_X509_AUX(fp,证书);
}
如果(ca和sk_X509_num(ca))
{
fprintf(fp,***其他证书***\n”);
对于(i=0;i
2+3)SSL\u CTX\u使用\u证书\u链\u文件导入所有证书链

{
    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);
    }
}
{
FILE*fp=NULL;
CString errorS=NULL;
PKCS12*p12=NULL;
EVP_PKEY*PKEY=NULL;
X509*证书=空;
(X509)*ca的栈_=NULL;
int i;
pkey=(执行副总裁*)新执行副总裁;
证书=(X509*)新X509;
做
{
if(fopen_s(&fp,CT2A(PKCS12文件),“rb”))
{
错误=(“打开文件%s\n”时出错,CT2A(pkcs12File));
打破
}
p12=d2i_PKCS12_fp(fp,NULL);
OpenSSL_添加_所有算法();
错误加载加密字符串();
如果(!p12)
{
错误=(“读取PKCS#12文件时出错”);
打破
}
如果(!PKCS12_parse(p12,CT2A(szPassword),&pkey,&cert,&ca))
{
errorS=(“解析PKCS#12文件时出错\n”);
打破
}
如果(fopen_s(&fp,CT2A(pszNameString+L“.pem”),“w”))
{
错误=(“打开文件%s\n”时出错,CT2A(文件名));
打破
}
如果(pkey)
{
fprintf(fp,***私钥***\n”);
PEM_write_PrivateKey(fp,pkey,NULL,NULL,0,NULL,NULL);
}
如果(证书)
{
fprintf(fp,***用户证书***\n”);
PEM_write_X509_AUX(fp,证书);
}
如果(ca和sk_X509_num(ca))
{
fprintf(fp,***其他证书***\n”);
对于(i=0;i
2+3)SSL\u CTX\u使用\u证书\u链\u文件导入所有证书链