Thrift在SSL_accept上随机崩溃

Thrift random crashes on SSL_accept

本文关键字:随机 崩溃 accept SSL Thrift      更新时间:2023-10-16

我正在用c++开发客户端和线程服务器,但我面临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.2 2d编译从源代码和标志使能-tlsext,从github/trunk和libevent从github/trunk。

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

知道这些错误的原因吗?

编辑

我已经编译了带有线程支持的OpenSSL(线程标志在。/configure上),现在我的应用程序总是触发错误

SSL_shutdown: broken pipe

,当客户端试图联系服务器。更详细地说,openssl s_client触发

sslv3 alert handshake failure

使用TLSv1.2作为协议。我检查了其他Stackoverflow问题但它没有帮助,只要我使用最新的OpenSSL快照

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

SIGPIPE信号

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

可以这样做:

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