2016-09-23 9 views
0

Я использую PEM_write_X509(x509*), чтобы написать сертификат, полученный при подключении к серверу SSL. Он работает в средах с одним потоком, но не работает в многопоточных средах.PEM_write_X509 (x509 *) и сбой в многопоточном процессе

В чем разница между PEM_write_X509_AUX() и PEM_write_X509()?

Можно ли сбросить сертификат, используя только write()?

Существуют ли другие возможности для записи файла сертификата в многопоточном приложении?

+0

* «Это работает в средах с одним потоком, но не работает в средах с несколькими потоками». * - вы можете показать свой код, который устанавливает блокировки. Но я думаю, что вопросы без него. Лично я работал бы с многопоточной проблемой сбоя, потому что у вас, вероятно, есть другие проблемы. Повреждение приложения скорее всего является проблемой симптомов или экземпляров. – jww

+0

*** «Будет ли нормально выдавать сертификат, используя только вызов write()?» *** - это большой НЕТ. «X509 *» - это структура данных в памяти. Его внутреннее представление и не означает сериализацию. Если вы попытаетесь, вы увидите некоторые данные сертификата и много указателей. Для сериализации в PEM и 'i2d_X509_bio' вам необходимо выполнить процедуры, такие как' PEM_write_bio_X509', для сериализации в формате ASN.1/DER. – jww

+0

есть. Я полностью согласен.... – Naga

ответ

0

Я могу решить эту проблему после использования следующего кода вместо PEM_write_X509().

X509 *cert = GetPeerCertificate(hostname, port); 
if(cert) 
{ 
    unsigned char *data; 
    unsigned int len = 0; 
    BIO *bio = BIO_new(BIO_s_mem()); 
    PEM_write_bio_X509(bio, cert); 
    len = BIO_get_mem_data(bio, &data); 
    if(0 != Writeile(certificate_file, data, len)) 
    { 
     ret = ERROR; 
    } 
    BIO_free(bio); 
}