2011-06-11 4 views
6

C++에서 gsoap 라이브러리를 사용해야하고 https를 사용해야합니다. 설명서에는 C에서 HTTPS를 사용하는 방법이 나와 있지만 C++에서는 HTTPS를 사용하지 않는 방법이 나와 있습니다 (http://www.cs.fsu.edu/~engelen/soapdoc2.html#tth_sEc19.20). 특히, 난 soap_ssl_init(); 함수에 대한 compulation 오류가 있습니다./usr/lib/libgsoap * 파일을 살펴본 결과 ligsoapssl ++ 파일이 발견되어 링크되었습니다. 이 오류는 사라졌지 만 error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed이 나옵니다. 즉, soap_ssl_client_context func를 호출해야하지만 C++ 생성 클래스에는 없습니다. 어떻게해야합니까?C++에서 SSL을 사용하는 방법 gSOAP 생성 클래스

UPD : 나는 혼자이 문제를 해결했습니다. 그러나 그것은 기발하고 매우 기발한 방식입니다. gSOAP이 구조체 비누로부터 상속 된 C++ 클래스를 생성, 그것은 attrs에 다음이 포함

BIO *bio; 
SSL *ssl; 
SSL_CTX *ctx; 
unsigned short ssl_flags; 
const char *keyfile; 
const char *password; 
const char *dhfile; 
const char *cafile; 
const char *capath; 
const char *crlfile; 
const char *randfile; 
SSL_SESSION *session; 

그래서 우리가 할 수있는 설정에 필요한 바인드합니다 (플래그, PARAMS) 자신에 의해에서 OpenSSL 라이브러리에있다. 간단한 경우 soap_ssl_init() 번으로 전화를 걸어 ssl_flags = SOAP_SSL_NO_AUTHENTICATION으로 설정하면 충분합니다. 그것은 나를 위해 작동합니다. 누구라도 더 좋은 방법을 알고 있다면 기꺼이 볼 수 있습니다.

+2

오류가 무엇을 얻고있다 :

soap_ssl_client_context(m_proxy.soap, SOAP_SSL_NO_AUTHENTICATION, NULL, NULL, NULL, NULL, NULL); 
m_proxy 클라이언트 프록시의 인스턴스

가 gSOAP을 사용하여 생성? – Mat

+0

'soap_ssl_init 정의되지 않은 참조 './usr/lib/libgsoap * 파일을 살펴본 결과 ligsoapssl ++ 파일이 발견되어 링크되었습니다. 이 오류는 사라졌지 만'오류 : 14090086 : SSL 루틴 : SSL3_GET_SERVER_CERTIFICATE : 인증서 확인에 실패했습니다. '라는 메시지가 나타납니다. 즉'soap_ssl_client_context' func를 호출해야하지만 C++ 생성 클래스에는 없습니다. 어떻게해야합니까? – milo

답변

0

나는 혼자이 문제를 해결했습니다. 그러나 그것은 기발하고 매우 기발한 방식입니다. gSOAP은 다음 attrs에 포함 struct soap로부터 상속 된 C++ 클래스를 생성 :

BIO *bio; 
SSL *ssl; 
SSL_CTX *ctx; 
unsigned short ssl_flags; 
const char *keyfile; 
const char *password; 
const char *dhfile; 
const char *cafile; 
const char *capath; 
const char *crlfile; 
const char *randfile; 
SSL_SESSION *session; 

그래서 우리가 할 수있는 우리 자신에 의해에서 OpenSSL 라이브러리 등의 설치에 필요한 바인드합니다 (플래그, PARAMS가). 간단한 경우 soap_ssl_init() 번으로 전화를 걸어 ssl_flags = SOAP_SSL_NO_AUTHENTICATION으로 설정하면 충분합니다. 그것은 나를 위해 작동합니다. 누구든지 더 좋은 방법을 알고 싶다면

+1

이렇게하면 보안 SSL 연결을 설정하기위한 요구 사항 인 서버 인증서 확인을 사용하지 않도록 설정합니다. – Bruno

+0

그래, 알아. 그러나'ssl_flags'와'const char * keyfile','const char * cafile' 등에서 keyfiles에 대한 적절한 플래그를 설정할 수 있습니다. – milo

+0

언제 서비스를 사용하기 전에 soap_ssl_init()를 호출할까요? –

0

내 C++ 프로그램에서 gsoap에 SSL 지원을 사용했지만 아무런 문제가 없었습니다. -DWITH_OPENSSL 지시문을 사용하여 소스 파일 stdsoap2.cpp (gsoap과 함께 제공됨)를 컴파일했습니다 (이 기능이 누락 되었습니까?). obj 파일을 사용하고 프로그램을 연결했습니다.

0

오늘 같은 문제가 발생했습니다. 나는 VirtualBox와 Gsoap 2.8.21에서 우분투 14.04를 사용하고있었습니다.

난 명령 C++ 프록시 클래스 생성 :

soapcpp2 -1 -I/opt/libraries/gsoap/build/2.8.21/share/gsoap/import -C -j temporary.h 

를 제 위치에서, I는 상기 용액을 사용 SOAP_SSL_NO_AUTHENTICATION ssl_flags로 설정. 이 오류 덕분에 사라졌습니다.

또한 SOAP_TLSv1 플래그를 변경하는 동안 오류가 사라지는 것을 관찰했습니다. 두통을 일으키는 플래그는 기본적으로 SOAP_SSL_DEFAULT 플래그 내에 설정된 SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION입니다.

플래그가있는 --enable-debug를 사용하여 소스에서 gsoap을 다시 컴파일 할 때까지는 아무 문제가 없었습니다. 내가보기 시작 직후 같은 :

SSL 오류 또는 깊이 1에서 인증서 경고를 확인합니다 수없는 지역 발급자 인증서를 얻을 수

지금까지 발견 된 가장 좋은 방법은 cacerts.pem을 다운로드하는 것입니다 gsoap 사이트 https://www.cs.fsu.edu/~engelen/cacerts.pem.zip의 파일을 열고 실행 파일 옆에 압축을 풉니 다.

soap *soap = soap_new(); 
soap->ssl_flags = SOAP_SSL_DEFAULT; 

soap_register_plugin(soap, soap_wsse); 
soap->cafile = "cacerts.pem"; 

그런 다음 모든 경고 및 오류 메시지가 사라 :

그리고 당신은 비슷한 있어야한다 코드에서 물론

.

1

이 나를 위해 작동합니다

wsdl2h.exe -o MyWebservice.h ..\MyWebservice.wsdl 
soapcpp2.exe -IC:\gsoap-2.8\gsoap\import -j MyWebservice.h -C -1 -SL