PEM_read_X509()以代码0退出

时间:2015-07-08 14:13:46

标签: c++ visual-studio-2010 openssl

我正在尝试在Visual Studio 2010中使用OpenSSL来读取.pem文件并解析x509证书。我得到了我的代码示例表单This tutorial,证书格式为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);

它以" Native'退出已退出代码0(0x0)。"

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

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

我也尝试用' r'打开文件。标志而不是' rb'。我还在google和SO上拖了几个小时。所有这一切都无济于事。没有错误,函数不会返回NULL,它只是以代码0退出。我怎样才能让它正常工作以便最终得到一个X509对象?

1 个答案:

答案 0 :(得分:1)

好吧,我仍然不知道为什么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函数。我不确定为什么,但这给了我一个可用的证书对象。我尝试了以前的函数PEM_read_X509,即使使用初始化对象也没有用。