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