出口和进口证书链

时间:2017-07-17 09:07:25

标签: c++ windows openssl pem pfx

我尝试从Windows证书存储区导出包含证书链和私钥的pfx文件,将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(内存blob /文件)转换为pem格式的命令

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

3)SSL_CTX_use_certificate_chain_file导入所有证书链还是我必须使用其他命令将所有链导入CTX结构

提前致谢

1 个答案:

答案 0 :(得分: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导入所有证书链