2015-10-15 1 views
0

Я разрабатываю клиент и сервер Threaded на C++, но мне приходится сталкиваться с проблемами с интеграцией OpenSSL/TLS.Случайные сбои случайных транзакций на SSL_accept

До сих пор я следил за ThriftServer.cpp и ThriftClient.cpp, но получаю случайные ошибки, которые вызывают крушение моего приложения. В частности, сбой происходит, когда клиент пытается вызвать определенный интерфейс бережливости на сервере (уже живет)

/* 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, составленным из источников и флага включить-tlsext, бережливость из GitHub/багажника и Libevent из GitHub/багажника.

Я пробовал свои собственные собственные сертификаты и сертификаты тестирования погруженные с бережливости: в обоих случаях он не работает, но они работают с OpenSSL s_client и OpenSSL s_server

Любые идея о причине этих ошибок?

EDIT

Я составил OpenSSL с поддержкой потоков (нитей флага на ./configure), и теперь мое приложение всегда вызывает ошибку

SSL_shutdown: broken pipe 

, когда клиент пытается связаться с сервером , Рытье больше деталей, OpenSSL s_client запускает

sslv3 alert handshake failure 

использованием TLSv1.2 в качестве протокола. Я проверил this other Stackoverflow вопрос, но это не помогло, до тех пор, как я использую последнюю версию OpenSSL снимок уже

+0

* «Любая идея о причине этих ошибок?» * - вы установили многопоточные замки OpenSSL,? – jww

+1

Привет, У меня была ошибка SSL_shutdown: broken pipe, попробуйте вызвать 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