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"
에서 감싸는 것을 시도했다. 그러나 나는 같은 오류를 얻었다.
제안 사항?
* "SSL_CTX 구조를 할당 할 수 없습니다 ..."* - NULL을 의미합니까? 그렇다면 OpenSSL 위키의 [Library Initialization] (https://wiki.openssl.org/index.php/Library_Initialization)에서 : * "라이브러리 초기화에 실패하면 NULL을 반환하는 SSL_CTX_new 같은 설명 할 수없는 오류가 발생합니다 , SSL_CTX_new와 같은 오류 메시지 : 라이브러리에 암호가없고 공유 암호가없는 경고 핸드 셰이크 실패 "*. – jww
*'_ZN13TdlsSSLSocketC1EPK13ssl_method_st' * : $ echo _ZN13TdlsSSLSocketC1EPK13ssl_method_st | C++ filt'는 'TdlsSSLSocket :: TdlsSSLSocket (ssl_method_st const *)'를 반환합니다. 심볼이 존재하는지 보려면'nm'을 사용하십시오. 'TestSSLServer.o'와'libttshared.so'를 모두 시도하십시오. – jww
출력되는 오류가 OpenSSL 구현에서 발생한 것으로 나타납니다. 예를 들어, catch되지 않는 std :: runtime_error 예외는 프로그램을 중단시키는 원인이됩니다. 나는 ctx가 NULL인지를 검사하는 것까지까지는 생각조차하지 않는다. 나는 SSL_CTX_new() 함수가 프로그램을 중단하고 정의되지 않은 심볼 오류를 내뱉고 있다고 믿는다. –