2011-06-11 22 views
6

necesito usar la biblioteca gsoap en C++ y necesito usar https. la documentación dice cómo trabajar con HTTPS en C, pero no en C++ (http://www.cs.fsu.edu/~engelen/soapdoc2.html#tth_sEc19.20). en particular, tengo un error de compilación en la función soap_ssl_init();. He buscado/usr/lib/libgsoap * archivos y he encontrado ligsoapssl ++. un archivo y vinculado a él. este error se ha ido, pero obtengo error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed. eso significa que necesito llamar al soap_ssl_client_context func, pero no existe en las clases generadas en C++. ¿Que debería hacer?cómo usar SSL en C++ gSOAP generó clases

UPD: he resuelto este problema yo solo. pero es peculiar, muy peculiar. gSOAP genera clases de C++ heredados de jabón estructura, que contiene los siguientes 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; 

por lo que puede configurar attrs necesarias (banderas, params) como en la librería OpenSSL por nosotros mismos. En caso simple, es suficiente llamar al soap_ssl_init() una vez y configurar ssl_flags = SOAP_SSL_NO_AUTHENTICATION. esto funciona para mi. si alguien sabe mejor, me complacerá ver.

+2

lo que es el error que está recibiendo? – Mat

+0

'soap_ssl_init referencia indefinida'. He buscado/usr/lib/libgsoap * archivos y he encontrado ligsoapssl ++. un archivo y vinculado a él. este error se ha ido, pero obtengo 'error: 14090086: rutinas SSL: SSL3_GET_SERVER_CERTIFICATE: verificación de certificado fallido'. eso significa que necesito llamar a 'soap_ssl_client_context' func, pero no hay clases generadas en C++. ¿Que debería hacer? – milo

Respuesta

0

he resuelto este problema yo solo. pero es peculiar, muy peculiar. gSOAP genera clases de C++ heredados de struct soap, contiene attrs siguientes:

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; 

por lo que puede configurar attrs necesarias (banderas, params) como en la biblioteca OpenSSL por nosotros mismos. En caso simple, es suficiente llamar al soap_ssl_init() una vez y configurar ssl_flags = SOAP_SSL_NO_AUTHENTICATION. esto funciona para mi. si alguien sabe mejor forma voy a gla

+1

Haciendo esto, deshabilita la verificación del certificado del servidor, que es un requisito para establecer una conexión SSL segura. – Bruno

+0

Sí, lo sé. pero puede establecer el indicador apropiado para 'ssl_flags' y las rutas a los archivos clave en' const char * keyfile', 'const char * cafile', etc. – milo

+0

, pero ¿cuándo llama a soap_ssl_init(), antes de usar el servicio? –

0

He utilizado el soporte SSL en gsoap en mi programa C++, y no he tenido ningún problema. Recopilé el archivo fuente stdsoap2.cpp (que viene junto con gsoap), con la directiva -DWITH_OPENSSL (¿extrañaste esto?). Usé el archivo obj y vinculé mi programa con él.

0

He tenido el mismo problema hoy. Estaba usando Ubuntu 14.04 en VirtualBox y Gsoap 2.8.21.

I generado C++ clases de proxy con el comando:

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

En un primer lugar, he utilizado la solución antes mencionada y establecer ssl_flags a SOAP_SSL_NO_AUTHENTICATION. Gracias a este error desapareció.

Además he observado que al cambiar los indicadores a SOAP_TLSv1, también hace que los errores desaparezcan. El indicador que causa dolores de cabeza fue SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION, que se establece de forma predeterminada dentro del indicador SOAP_SSL_DEFAULT.

Todo parecía estar bien, hasta que recompuse gsoap desde el código fuente --enable-debug. Poco después empecé a ver algo como:

SSL verificar error o advertencia con el certificado a una profundidad de 1: No se puede obtener el certificado emisor local de

La mejor solución que encontré hasta ahora es descargar el cacerts.pem archivo desde el sitio gsoap https://www.cs.fsu.edu/~engelen/cacerts.pem.zip y descomprímalos al lado de su ejecutable.

Y, por supuesto, en su código que debe tener algo similar a:

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

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

Entonces todos los mensajes de advertencia y error desaparecen.

1

Esto funciona para mí:

soap_ssl_client_context(m_proxy.soap, SOAP_SSL_NO_AUTHENTICATION, NULL, NULL, NULL, NULL, NULL); 

donde m_proxy es una instancia del proxy de cliente generaron utilizando gSOAP:

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