2015-10-15 120 views
0

我正在开发一个客户端和一个C++的Threaded服务器,但是我面临着OpenSSL/TLS集成的问题。SSL_accept的节俭随机崩溃

到目前为止,我已经遵循了ThriftServer.cpp和ThriftClient.cpp,但是我收到了导致应用程序崩溃的随机错误。有时它给了我

TConnectedClient died: SSL_accept: error 0 

有时

: 具体而言,当一个客户端尝试调用服务器(已经生活)

/* 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: parse tlsext 

并且都以SIGSEV结尾。

我运行一个Debian 8.1 x64的从来源和标志编译的最新的OpenSSL 1.0.2d 使-tlsext,从GitHub /躯干和libevent的从GitHub /主干节俭。

我已经尽我的自定义自签名的证书,并随节俭的检测证书:在这两种情况下,这是行不通的,但它们与的OpenSSL的s_client.FirstOpenSSL的s_server

任何工作关于这些错误的原因的想法?

编辑

我编译的OpenSSL与线程支持(上的./configure线程标志),现在我的应用程序始终触发错误

SSL_shutdown: broken pipe 
当客户端试图联系服务器

。挖掘更多细节,openssl s_client触发使用TLSv1.2作为协议的一个

sslv3 alert handshake failure 

。我检查了this other Stackoverflow的问题,但它没有帮助,只要我已经使用最新的OpenSSL快照

+0

*“知不知道有关这些错误的原因是什么?” * - 你安装OpenSSL的多线程锁吗? – jww

+1

嗨,我有'SSL_shutdown:断管'错误,尝试呼叫完成时调用客户端中的transport-> close()。 – KLiFF

回答

1

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

SIGPIPE信号

应用程序上运行OpenSSL的网络连接上,如果SIGPIPE没有忽略可能会崩溃。这发生在他们收到远程对等异常重置的连接时,它以某种方式触发SIGPIPE信号。如果没有处理,这个信号会杀死应用程序。

这是可以做到的:

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

感谢您的回答,即使我现在不需要使用OpenSSL +节俭,可能是新的OpenSSL 1.1.x解决了这个问题,但我没有对它进行测试。 – madduci