2015-07-08 2 views
0

Я пытаюсь использовать OpenSSL в Visual Studio 2010, чтобы прочитать файл .pem и проанализировать сертификат x509. Я получил мой пример кода формы This tutorial сертификат отформатирован в базе 64, называется «secondtry.pem» и выглядит следующим образом:PEM_read_X509() выходит с кодом 0

-----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); 

Я также попытался открыть файл с «г» флаг вместо «гб». Я также трал Google и SO в течение нескольких часов. Все это безрезультатно. Нет ошибки, и функция не возвращает NULL, она просто выходит с кодом 0. Как я могу заставить это работать правильно, чтобы в итоге я получил объект X509?

ответ

0

Ну, я до сих пор не знаю, почему функция 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; 
} 

Это возвращает сертификат, из которого я могу получить данные. Двумя основными отличиями являются инициализация cert при вызове new() и использовании функции PEM_read_bio_X509. Я не уверен, почему, но это дает мне полезный объект сертификата. Я пробовал простую функцию PEM_read_X509, и она не работала даже с инициализированным объектом.

+0

Не стесняйтесь публиковать другие ответы. Этот способ является обходным, но не удовлетворительным ответом на 100%. –

+0

Я думаю, что вы забыли освободить 'bio_cert' – tzippy

Смежные вопросы