C++ PEM_read_X509()退出,代码为0

C++ PEM_read_X509()退出,代码为0,c++,visual-studio-2010,openssl,C++,Visual Studio 2010,Openssl,我试图在VisualStudio2010中使用OpenSSL读取.pem文件并解析x509证书。我得到了我的代码示例表单,证书的格式为base 64,名为'secondtry.pem',如下所示: -----BEGIN CERTIFICATE----- MIIDHjCCAtygAwIBAgIEIDJHfjALBgcqhkjOOAQDBQAwYTELMAkGA1UEBhMCVVMxCzAJBgNVBAgT AkZMMRIwEAYDVQQHEwlNZWxib3VybmUxDjAMBgNVBAoTBU

我试图在VisualStudio2010中使用OpenSSL读取.pem文件并解析x509证书。我得到了我的代码示例表单,证书的格式为base 64,名为'secondtry.pem',如下所示:

-----BEGIN CERTIFICATE-----
MIIDHjCCAtygAwIBAgIEIDJHfjALBgcqhkjOOAQDBQAwYTELMAkGA1UEBhMCVVMxCzAJBgNVBAgT
AkZMMRIwEAYDVQQHEwlNZWxib3VybmUxDjAMBgNVBAoTBU1vbnRoMQwwCgYDVQQLEwNEYXkxEzAR
BgNVBAMTCkp1bHkgRWlnaHQwHhcNMTUwNzA4MTMwNDA2WhcNMTUxMDA2MTMwNDA2WjBhMQswCQYD
VQQGEwJVUzELMAkGA1UECBMCRkwxEjAQBgNVBAcTCU1lbGJvdXJuZTEOMAwGA1UEChMFTW9udGgx
DDAKBgNVBAsTA0RheTETMBEGA1UEAxMKSnVseSBFaWdodDCCAbcwggEsBgcqhkjOOAQBMIIBHwKB
gQD9f1OBHXUSKVLfSpwu7OTn9hG3UjzvRADDHj+AtlEmaUVdQCJR+1k9jVj6v8X1ujD2y5tVbNeB
O4AdNG/yZmC3a5lQpaSfn+gEexAiwk+7qdf+t8Yb+DtX58aophUPBPuD9tPFHsMCNVQTWhaRMvZ1
864rYdcq7/IiAxmd0UgBxwIVAJdgUI8VIwvMspK5gqLrhAvwWBz1AoGBAPfhoIXWmz3ey7yrXDa4
V7l5lK+7+jrqgvlXTAs9B4JnUVlXjrrUWU/mcQcQgYC0SRZxI+hMKBYTt88JMozIpuE8FnqLVHyN
KOCjrh4rs6Z1kW6jfwv6ITVi8ftiegEkO8yk8b6oUZCJqIPf4VrlnwaSi2ZegHtVJWQBTDv+z0kq
A4GEAAKBgDH20wAdrFDjcp2hJm2M9y/tm+VCnQP5sL8knITNrDoJXrj6NEkDNkjIlJrXbrPpWuM+
uNbmFOZQAusHNX4gyRfoJCWRAIyOAQ5RsUOEb7isdjnxplbRipFF81NQXJ4XVsZ8wzTZ5quUFhq8
TWOb7Nw6GuaM9BA5tcQZgPMNrZo9oyEwHzAdBgNVHQ4EFgQUtPDQywlbEA/oCiMwN7OXBaxYqoow
CwYHKoZIzjgEAwUAAy8AMCwCFE8buS4tUi3zdlKJzZrnjmFVp8jrAhRnGgZ5/sxU9cTg+1IWZPHx
kBMc7A==
-----END CERTIFICATE-----
我有一个函数可以打开.pem文件并将其分配给X509对象,以便以后进行解析。以下是函数:

X509* openPemFile(char* filename)
{
    X509* cert;
    FILE* certfile = fopen(filename, "rb");
    if(!certfile)
    {
        fprintf( stdout, "Unable to open file %s\n", filename);
        return NULL;
    }


    PEM_read_X509(certfile, &cert, 0, NULL);

    if(!cert)
    {
        fprintf(stdout, "Unable to parse certificate in: %s\n", filename);
        fclose(certfile);
        return NULL;
    }

    return cert;
}
我这样调用函数:

X509* cert = openPemFile("secondtry.pem");
文件打开时没有错误,但当我的代码到达行时:

PEM_read_X509(certfile, &cert, 0, NULL);
它以“本机”退出,并以代码0(0x0)退出。”

我尝试过以几种不同的方式调用PEM_read_x509函数:

 X509* cert = PEM_read_X509(certfile, NULL, NULL, NULL);
    PEM_read_X509(certfile, &cert, NULL, NULL);

我还尝试使用“r”标志而不是“rb”打开文件。我也用拖网搜索了谷歌等几个小时。所有这些都是徒劳的。没有错误,并且函数不返回NULL,它只是以代码0退出。我怎样才能让它正常工作,从而得到一个X509对象?

好吧,我仍然不知道为什么PEM_read_X509函数不能工作,但我相信我已经找到了一个解决方法

X509* openPemFile(char* filename)
{

    X509* cert = X509_new();
    BIO* bio_cert = BIO_new_file(filename, "rb");
    PEM_read_bio_X509(bio_cert, &cert, NULL, NULL);
    return cert;
}

这将返回一个我可以从中获取数据的证书。两个主要区别是使用new()调用初始化cert,以及使用PEM_read_bio_X509函数。我不知道为什么,但这给了我一个可用的证书对象。我尝试了pervious函数,PEM_read_X509,但它不起作用,即使是初始化的对象。

请随意发布其他答案。这是一个解决办法,但不是100%满意的答案。我想你忘记释放
bio\u证书了