在验证证书时,OpenSSL与Sig11崩溃

时间:2016-06-30 07:11:33

标签: c++ linux qt openssl

我已经构建了如下所示的openssl 1.0.2h版本,

./Configure -d shared no-idea no-mdc2 no-rc5 debug-linux-x86_64 --prefix=@rpath --openssldir=.

我已经建立了以下库

libssl.so.1.0.2
libcrypto.so.1.0.2

我已经将这些库与我的C ++应用程序以及Qt 5.0.0相关联。当我运行我的应用程序时,它使用segmentation fault与以下堆栈跟踪崩溃,

Thread #1 22887 (Suspended : Container) 
        trust_1oidany() at x509_trs.c:270 0x7f66362255a9    
        X509_check_trust() at x509_trs.c:134 0x7f6636225141 
        check_trust() at x509_vfy.c:807 0x7f663621c212  
        X509_verify_cert() at x509_vfy.c:370 0x7f663621b3f5 
        ssl_verify_cert_chain() at 0x3f2a2469b8 
        ssl3_get_server_certificate() at 0x3f2a2255f3   
        ssl3_connect() at 0x3f2a227ca2  
        q_SSL_connect() at qsslsocket_openssl_symbols.cpp:229 0x7f6639b1064a    
        QSslSocketBackendPrivate::startHandshake() at qsslsocket_openssl.cpp:1,128 0x7f6639b0af78   
        QSslSocketBackendPrivate::transmit() at qsslsocket_openssl.cpp:983 0x7f6639b0a4ea   
        QSslSocketPrivate::_q_readyReadSlot() at qsslsocket.cpp:2,431 0x7f6639afcbc3    
        QSslSocket::qt_static_metacall() at moc_qsslsocket.cpp:167 0x7f6639afdc79   
        QMetaObject::activate() at qobject.cpp:3,739 0x7f663907dab6 
        QMetaObject::activate() at qobject.cpp:3,604 0x7f663907d2b6 
        QIODevice::readyRead() at moc_qiodevice.cpp:155 0x7f6639115081  
        QAbstractSocketPrivate::canReadNotification() at qabstractsocket.cpp:730 0x7f6639ad4bc6 
        QAbstractSocketPrivate::readNotification() at qabstractsocket_p.h:69 0x7f6639adae1a 
        QAbstractSocketEngine::readNotification() at qabstractsocketengine.cpp:152 0x7f6639ac6701   
        QReadNotifier::event() at qnativesocketengine.cpp:1,169 0x7f6639ae3a06  
        QApplicationPrivate::notify_helper() at qapplication.cpp:3,753 0x7f6637647b22   
        QApplication::notify() at qapplication.cpp:3,197 0x7f66376451dc 
        QCoreApplication::notifyInternal() at qcoreapplication.cpp:965 0x7f663903eb36   
        QCoreApplication::sendEvent() at qcoreapplication.h:224 0x7f66390428c7  
        socketNotifierSourceDispatch() at qeventdispatcher_glib.cpp:101 0x7f66390b5450  
        g_main_context_dispatch() at 0x3f1aa40642   
        0x3f1aa44c98    
        g_main_context_iteration() at 0x3f1aa44e4c  
        QEventDispatcherGlib::processEvents() at qeventdispatcher_glib.cpp:418 0x7f66390b6199   
        QEventLoop::processEvents() at qeventloop.cpp:128 0x7f663903b712    
        QEventLoop::exec() at qeventloop.cpp:204 0x7f663903b9f5 
        QThread::exec() at qthread.cpp:522 0x7f6638df9000   
        QThread::run() at qthread.cpp:589 0x7f6638df91a6    
        QThreadPrivate::start() at qthread_unix.cpp:338 0x7f6638e00683  
        start_thread() at 0x3f19a07aa1  
        clone() at 0x3f192e8aad 

当我调试它时,下面的行有一些无效的指针取消引用,

if (x->aux && (x->aux->trust || x->aux->reject))

但是我无法找出造成这种情况的原因。我没有任何指针可以继续解决这个问题。有人可以说清楚这一点。

1 个答案:

答案 0 :(得分:0)

我找到了这个问题的根本原因。我在本地构建的openssl库不包含-rpath,因此libssl.so无法找到libcrypto.so,因此问题就出现了。因此我更新了Configure以包含-rpath,如所示here。另请参阅此link,了解我如何设置多个-rpath选项。尽管我不确定这是否是合法的做法,但解决方案对我有用。