OpenSSL i2d_x509_bio, тогда d2i_x509_bio завершается ошибкой - PullRequest
2 голосов
/ 27 сентября 2019

Я пытаюсь реализовать клиент SSL, который запоминает сертификат, полученный от сервера.

Когда приложение запускается, оно пытается прочитать предыдущий сертификат в формате DER.

Если он не найден, он извлекает сертификат с сервера как X509 и записывает его в формате DER.

При последующих выполнениях, когда он читает сертификат в формате DER - d2i_x509_bio завершается ошибкой с рядом ошибок.

bool writeCertificateDER(char * path, X509* newCert)
{
bool rc                     = false;    
BIO *file                   = NULL;
unsigned long error;
char * errorString;

// skipping argument error checking

 if ( NULL == (file = BIO_new_file( path, "w" )) )
    {
        cerr <<  "writeCertificateDER - cannot create file " << path << endl;
        return false;
    }
    if ( i2d_X509_bio( file, newCert ) == 1)
    {
        BIO_flush( file );
        rc = true;
    }
    else
    {
        while ( (error = ERR_get_error( )) != 0 )
        {
            narrowError = ERR_error_string( error, NULL );// uses internal buffer
            RS_CharToWide( errorString, narrowError, tsizeof( errorString ) );
            cerr << "writeCertificateDER - i2d_X509_bio of file ["<< path<< "] failed with error "<<errorString << endl;
        }
        rc = false;
    }

    BIO_free( file );

    return rc;
}

X509 * readCertificateDER( const TCHAR *path )
{
    X509 *newCert= NULL;
    BIO *file = NULL;
    bool rc = false;
    unsigned long error;
    char * errorString;


    if ( path == NULL  || _tcslen(path) == 0)
    {
        cerr << " readCertificateDER - path is NULL." << endl;
    }
    else
    {
        if ( NULL == (file = BIO_new(BIO_s_file())) )
        {
            cerr << "readCertificateDER - cannot open file "<< path  << endl;
        }
        else
        {
            if ( BIO_read_filename( file, path ) <= 0 )
            {
                   cerr << "readCertificateDER - cannot read file "<< path << endl;
            }
            else if ( (newCert = d2i_X509_bio( file,NULL )) == NULL )
            {
                while ( (error = ERR_get_error( )) != 0 )
                {
                    errorString = ERR_error_string( error, NULL );// uses internal buffer
                    cerr << "readCertificateDER - d2i of file [" << path << "] failed with error " << errorString );
                }
            }
        }
        BIO_free( file );
    }
    return newCert;
}

итоговые журналы выглядят примерно так:

readCertificateDER - d2i файла [\ temp \ Cert.der] завершился ошибкой: 0D07207B: подпрограммы кодирования asn1: ASN1_get_object: заголовок слишком длинный

readCertificateDER - ошибка d2i файла [\ temp \ Cert.der] с ошибкой: 0D068066: процедуры кодирования asn1: asn1_check_tlen: неверный заголовок объекта

readCertificateDER - d2i файлаСбой [\ temp \ Cert.der] с ошибкой: 0D06C03A: процедуры кодирования asn1: asn1_d2i_ex_primitive: вложенная ошибка asn1

readCertificateDER - ошибка d2i файла [\ temp \ Cert.der] с ошибкой: 0D08303A:процедуры кодирования asn1: asn1_template_noexp_d2i: вложенная ошибка asn1

readCertificateDER - ошибка d2i файла [\ temp \ Cert.der] с ошибкой: 0D08303A: процедуры кодирования asn1: asn1_template_noexp_d2: asn1_template_noexp_d2: asn1_template_noexp_d2

Я полностью готов поверить, что пропустил один или несколько шагов - но хотел бы помочь, чтобы выяснить, что это или за эти шаги.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...