2015-10-15 70 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