2013-10-07 1 views
1

Мне нужно подключить свою кросс-платформенную программу к веб-службе SOAP. Я собрал инструменты gSOAP wsdl2h и soapcpp2, и с помощью этих инструментов я сгенерировал файлы исходного кода из файла .wsdl. Я поместил в stdsoap2.h определение «#define WITH_OPENSSL» и таким образом используется SSL. Проблема в том, что когда я вызываю службу, вызов возвращает ERROR 30, что означает SSL ERROR, но я не знаю, в чем проблема. Я знаю, что сервер отправляет самозаверяющий сертификат, потому что это тестовая среда. На самом деле сообщение об ошибке, связанное с этим, печатается. Выход:gSOAP - Как использовать SSL и самозаверяющий сертификат

Creating SOAP objects ... 
Calling SOAP httpAccessService: 
SSL verify error or warning with certificate at depth 0: self signed certificate 
certificate issuer /C=IT/ST=Milan/L=Milan/O=Company/OU=Company/CN=company.it 
certificate subject /C=IT/ST=Milan/L=Milan/O=Company/OU=Company/CN=company.it 
SOAP ERROR 30 

Функции я использовать для вызова службы заключается в следующем:

недействительного gSOAPTesting :: RunTest() { INT результата = 0; size_t requestSize; size_t responseSize;

char endpoint[1024]; 
char buffer[8192]; 

string SoapAction; 
struct soap *soap_container; 

ApplicationConfigurationServiceSoapBindingProxy Proxy1; 

_ns1__httpAccessService *httpAccessService; 
_ns1__httpAccessServiceResponse *httpAccessServiceResponse; 

printf("Creating SOAP objects ...\n"); 
soap_container = soap_new(); 
//soap_container->mode 
httpAccessService = (_ns1__httpAccessService *) soap_instantiate(soap_container , SOAP_TYPE___ns1__httpAccessService , "" , "" , &requestSize); 
httpAccessServiceResponse = (_ns1__httpAccessServiceResponse *) soap_instantiate(soap_container , SOAP_TYPE___ns1__httpAccessService , "" , "" , &responseSize); 

soap_ssl_init(); /* init OpenSSL (just once) */ 

if(soap_ssl_client_context(soap_container , 
SOAP_SSL_DEFAULT , 
NULL, 
NULL, 
NULL, 
NULL, 
NULL  
) != SOAP_OK) 
{ 
    printf("SOAP SSL Initialization Failure\n"); 
    soap_print_fault(soap_container , stderr); 
    return ; 
} 

printf("Calling SOAP httpAccessService:\n"); 

SoapAction.clear(); 
SoapAction.append(SOAP_NAMESPACE_OF_ns1); 
SoapAction.append("/"); 
SoapAction.append("httpAccessService");  

result = Proxy1.httpAccessService("https://XXX.XXX.XXX.XXX:XXXX" , NULL , httpAccessService , httpAccessServiceResponse); 

if(result == SOAP_OK) 
{ 
    printf("SOAP OK\n");       
} 
else 
{ 
    printf("SOAP ERROR %d\n" , result); 

    if(soap_check_state(soap_container)) printf("Error: request soap struct not initialized\n"); 

    if(httpAccessService->soap == NULL) 
    { 
     printf("Error: NULL request SOAP struct\n"); 
     return;       
    } 

    if(httpAccessService->soap->endpoint == NULL) printf("Error: Empty request endpoint\n"); 

    soap_stream_fault(soap_container , std::cout);   
}  

}

Любая помощь приветствуется.

ответ

1

Проблема связана с сертификатом, которому не доверяют, потому что он самоподписан. Если я комментирую эти строки в stdsoap2.cpp ...

if (!ok) 
{ soap_set_sender_error(soap, "SSL/TLS error", "SSL/TLS certificate host name mismatch in tcp_connect()", SOAP_SSL_ERROR); 
    soap->fclosesocket(soap, sk); 
    return SOAP_INVALID_SOCKET; 
} 

... сертификат принимается, даже если он выдан неизвестной организацией.

0

если (soap_ssl_client_context (& мыло, SOAP_SSL_NO_AUTHENTICATION, NULL, NULL, NULL,/* ```````````````````````````````` */ NULL, NULL)! = SOAP_OK) {

Если вы хорошо игнорировании хоста, может делать что-то вроде выше, а не компилировать вещи в сгенерированных файлах