2016-09-23 196 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); 
}