PEM_read_X509() 以代码 0 退出

PEM_read_X509() exits with code 0

我正在尝试在 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' has exited with code 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 几个小时。这一切都无济于事。没有错误,并且该函数不 return 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;
}

这个 returns 我可以从中获取数据的证书。两个主要区别是使用 new() 调用初始化证书,以及使用 PEM_read_bio_X509 函数。我不确定为什么,但这给了我一个可用的证书对象。我尝试了前面的函数,PEM_read_X509,但它没有用,即使是初始化对象。