2017-01-27 17 views
0

OpenSSL API를 사용하는 C++ SSL 소켓 클래스를 작성했습니다. OpenSSL의 버전은 중요한 경우 "OpenSSL 1.0.0-fips"입니다. 이 클래스는 내가 작성한 공유 라이브러리에 속한다.OpenSSL 1.0.0-FIPS Symbol Lookup Error

맨손으로 뼈대 단위 테스트를 작성하려고하는데 SSL_CTX 구조를 할당 할 수 없습니다. 다음은

g++ -fPIC -g -O2 -Wall -c -o TdlsSSLSocket.o TdlsSSLSocket.cpp 
ld -r TdlsTCPSocket.o TdlsTCPClient.o TdlsTCPServer.o ReferenceCounter.o TdlsSSLSocket.o -o socket.o 

:

여기
#include "TdlsSSLSocket.hpp" 

TdlsSSLSocket::TdlsSSLSocket(const SSL_METHOD* method) 
{ 
    ctx = SSL_CTX_new(method); 
    if(!ctx) 
    { 
    throw std::runtime_error("Failed to initialize SSL CTX object"); 
    } 
} 

나는이 소스 코드를 컴파일하는 방법입니다 : 여기

#ifndef __TDLS_SSL_SOCKET_HPP__ 
#define __TDLS_SSL_SOCKET_HPP__ 

#include <stdexcept> 

#include <openssl/ssl.h> 
#include <openssl/x509v3.h> 
#include <openssl/err.h> 

class TdlsSSLSocket 
{ 
public: 
    TdlsSSLSocket(const SSL_METHOD* method); 
protected: 
    SSL_CTX* ctx; 
}; 

#endif 

생성자의 구현 : 여기에

내 헤더 파일입니다 공유 라이브러리를 만드는 방법 :

g++ -shared -Wl,-soname,libttshared.so.2 -lssl -o libttshared.so.2.0 logger/log.o conf/conf_objs.o seq/seq.o socket/socket.o 

다음은 클래스를 연습하려고 시도한 C++ 단위 테스트입니다.

#include <iostream> 

#include "TdlsSSLSocket.hpp" 

using namespace std; 

int main(int argc, char* argv[]) 
{ 

    SSL_library_init(); 
    SSL_load_error_strings(); 

    TdlsSSLSocket ssl_server(TLSv1_method()); 

} 

그리고 난 그렇게처럼 구축 :

g++ -o TestSSLServer TestSSLServer.o ../../libttshared.so -L../.. -lttshared 

내가 단위 테스트를 실행할 때, 나는 다음과 같은 오류 얻을 :

[[email protected] test]$ TestSSLServer 
TestSSLServer: symbol lookup error: TestSSLServer: undefined symbol: _ZN13TdlsSSLSocketC1EPK13ssl_method_st 

_ZN13TdlsSSLSocketC1EPK13ssl_method_st 거의처럼 보이는 이상한 정의되지 않은 심볼을 C++ 이름 맹 글링이 범인이 될 수 있습니다. 그러나, 나는 클래스를 extern "C"에서 감싸는 것을 시도했다. 그러나 나는 같은 오류를 얻었다.

제안 사항?

+0

* "SSL_CTX 구조를 할당 할 수 없습니다 ..."* - NULL을 의미합니까? 그렇다면 OpenSSL 위키의 [Library Initialization] (https://wiki.openssl.org/index.php/Library_Initialization)에서 : * "라이브러리 초기화에 실패하면 NULL을 반환하는 SSL_CTX_new 같은 설명 할 수없는 오류가 발생합니다 , SSL_CTX_new와 같은 오류 메시지 : 라이브러리에 암호가없고 공유 암호가없는 경고 핸드 셰이크 실패 "*. – jww

+0

*'_ZN13TdlsSSLSocketC1EPK13ssl_method_st' * : $ echo _ZN13TdlsSSLSocketC1EPK13ssl_method_st | C++ filt'는 'TdlsSSLSocket :: TdlsSSLSocket (ssl_method_st const *)'를 반환합니다. 심볼이 존재하는지 보려면'nm'을 사용하십시오. 'TestSSLServer.o'와'libttshared.so'를 모두 시도하십시오. – jww

+0

출력되는 오류가 OpenSSL 구현에서 발생한 것으로 나타납니다. 예를 들어, catch되지 않는 std :: runtime_error 예외는 프로그램을 중단시키는 원인이됩니다. 나는 ctx가 NULL인지를 검사하는 것까지까지는 생각조차하지 않는다. 나는 SSL_CTX_new() 함수가 프로그램을 중단하고 정의되지 않은 심볼 오류를 내뱉고 있다고 믿는다. –

답변

0

이 글을 읽는 모든 사람들에게 문제는 OpenSSL 라이브러리가 아닙니다. 정의되지 않은 기호 문제는 링커가 주어진 기호를 해석 할 수 없음을 의미합니다. 나는 단위 테스트 바이너리 인 TestSSLServer에서 ldd을 수행했으며 현재 버전 libttshared.so에 연결하지 않았다는 것을 알았습니다. LD_LIBRARY_PATH 변수를 설정하여 새 공유 라이브러리의 디렉토리를 포함시키고 프로그램을 성공적으로 실행했습니다.