SSL_CTX_new中的分段错误

时间:2012-10-04 00:32:17

标签: c unix ssl openssl segmentation-fault

我正在尝试通过SSL作为客户端进行连接,并且看到了一些奇怪的行为。 在尝试创建新的SSL_CTX_new上下文时,SSL内部出现间歇性分段错误。还应该注意的是,这是fCGI demon,并且在运行时似乎只有问题。如果我将它作为独立的cgi应用程序运行,问题似乎就会消失。

查看核心文件,这就是我所看到的:

  

夹板(??,??)位于0xd03c36f4
     malloc_y(0x4c,0x0,0x9e,0x0,0x20062240,0x170,0x0,0x0)位于0xd03c5bcc
     malloc_common_81_64(??)位于0xd03512b8
     mem.default_malloc_ex()位于0xd0b0f784
     CRYPTO_malloc_24_10()位于0xd0b101c8
     ssl_cert.ssl_cert_new()位于0xd6f86084
     ssl_lib.SSL_CTX_new()位于0xd6f83084

有没有人碰到类似的东西?对先前问题的搜索发现了SSL_CTX_new返回NULL的一些讨论,但没有关于细分错误的报告。

这是我用来创建新上下文的函数:

SSL_CTX* newSSLContext(char* keyfile, char* password) {  
   SSL_METHOD *meth;  
   SSL_CTX *ctx;  
   if (!bio_err) {  
      SSL_library_init();  
      SSL_load_error_strings();  
      bio_err = BIO_new_fp(stderr, BIO_NOCLOSE);  
   }  
   signal(SIGPIPE, sigpipe_handle);  
   meth = SSLv23_method();  
   ctx = SSL_CTX_new(meth);  
   if (!(SSL_CTX_use_certificate_chain_file(ctx, keyfile))) {  
      err("Can't read certificate file");  
      return NULL;  
   }  
   pass = password;  
   SSL_CTX_set_default_passwd_cb(ctx, password_cb);  
   if (!(SSL_CTX_use_PrivateKey_file(ctx, keyfile, SSL_FILETYPE_PEM))) {  
      err("Can't read key file");  
      return NULL;
   }  
   if (!(SSL_CTX_load_verify_locations(ctx, keyfile, 0))) {  
      err("Can't read CA list");  
      return NULL;  
   }  
   return ctx;  
}

2 个答案:

答案 0 :(得分:3)

您是否正在将bio_err变量初始化为NULL?如果您未在SSL_library_init之前致电SSL_CTX_new,则会出现段错误。

答案 1 :(得分:0)

缺乏良好的解决方案。为了满足我的SSL需求,我已经转而使用libcurl。这似乎简化了我实际要编写的代码。