我正在用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快照,它就无济于事
答案 0 :(得分:2)
关于SSL_shutdown问题,根据此document,您应该忽略SIGPIPE信号以避免服务器崩溃:
SIGPIPE信号
如果不忽略SIGPIPE,则通过网络连接运行OpenSSL的应用程序可能会崩溃。当它们通过远程对等异常接收连接重置时会发生这种情况,这会以某种方式触发SIGPIPE信号。如果不处理,此信号将终止应用程序。
这可以通过以下方式完成:
#include <csignal>
// ...
signal(SIGPIPE, SIG_IGN);