在SSL_accept上随机崩溃

时间:2015-10-15 17:11:19

标签: c++ openssl thrift

我正在用C ++开发一个客户端和一个Threaded服务器,但我遇到了OpenSSL / TLS集成的问题。

到目前为止,我已经关注了ThriftServer.cpp和ThriftClient.cpp,但是我遇到了导致我的应用程序崩溃的随机错误。 具体来说,当客户端尝试调用服务器上已定义的thrift接口(已经存在)

时,就会发生崩溃
/* server init with PEM public/private certificates 
 * and trusted certificates, socketFactory->accept(true),  
 * transport->open() */

myServer->start();  //running on separated thread, calling thriftserver->serve();

/* client init with PEM public/private certificates 
 * and trusted certificates, socketFactory->accept(true),  
 * transport->open() */

myClient->beginSession(); //Thrift API call - crash

崩溃是非常通用的:有时它会给我

TConnectedClient died: SSL_accept: error 0

有时候

TConnectedClient died: SSL_accept: parse tlsext

并且都以SIGSEV结尾。

我正在运行Debian 8.1 x64,其中包含从源代码编译的最新OpenSSL 1.0.2d和标记 enable-tlsext ,来自github / trunk的thrift和来自github / trunk的libevent。

我已经尝试过我的自定义自签名证书和Thrift附带的测试证书:在这两种情况下它都不起作用,但它们正在使用 openssl s_client openssl s_server

有关这些错误原因的任何想法吗?

修改

我已经使用Thread支持编译了OpenSSL(./configure上的threads标志),现在我的应用程序始终触发错误

SSL_shutdown: broken pipe

当客户端尝试联系服务器时。详细挖掘,openssl s_client会触发

sslv3 alert handshake failure

使用TLSv1.2作为协议。我已经检查了this other Stackoverflow问题,但只要我已经使用最新的OpenSSL快照,它就无济于事

1 个答案:

答案 0 :(得分:2)

关于SSL_shutdown问题,根据此document,您应该忽略SIGPIPE信号以避免服务器崩溃:

  

SIGPIPE信号

     

如果不忽略SIGPIPE,则通过网络连接运行OpenSSL的应用程序可能会崩溃。当它们通过远程对等异常接收连接重置时会发生这种情况,这会以某种方式触发SIGPIPE信号。如果不处理,此信号将终止应用程序。

这可以通过以下方式完成:

#include <csignal>
// ...
signal(SIGPIPE, SIG_IGN);