2016-09-23 200 views
0

我使用PEM_write_X509(x509*)來編寫連接到SSL服務器時收到的證書。這在單線程環境中工作,但在多線程環境中失敗。PEM_write_X509(x509 *)和多線程進程崩潰

PEM_write_X509_AUX()PEM_write_X509()有什麼區別?

只需使用write()調用轉儲證書就可以嗎?

是否有其他選項可以在多線程應用程序中編寫證書文件?

+0

*「這是在單線程環境中工作,但在多線程環境中失敗。」* - 你可以顯示你的代碼來安裝鎖。但是我認爲如果沒有它的話,問題是可以回答的。就我個人而言,我會處理多線程崩潰問題,因爲您可能有其他問題。應用程序崩潰可能只是一個症狀或實例問題。 – jww

+0

***「使用write()調用轉儲證書會好嗎?」*** - 這是一個很大的NO。 'X509 *'是內存數據結構。它是一個內部表示,並不意味着被序列化。如果你嘗試,你會看到一些證書數據和很多指針。您需要像PEM_write_bio_X509'這樣的例程在PEM中序列化,'i2d_X509_bio'以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); 
}