cómo usar SSL en clases generadas en C++ gSOAP
https (4)
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 soap_ssl_init();
en soap_ssl_init();
función. He buscado / usr / lib / libgsoap * archivos y he encontrado ligsoapssl ++. un archivo y vinculado a él. este error se ha ido, pero obtengo un error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
. eso significa que necesito llamar a soap_ssl_client_context
func, pero no hay clases generadas en C ++. ¿Que debería hacer?
UPD: he solucionado este problema yo solo. pero es peculiar, muy peculiar. gSOAP genera clases de C ++ heredadas de struct soap, 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;
para que podamos configurar los atributos necesarios (banderas, parámetros) como en la biblioteca OpenSSL por nosotros mismos. En caso simple, es suficiente llamar a soap_ssl_init()
una vez y establecer ssl_flags = SOAP_SSL_NO_AUTHENTICATION
. esto funciona para mi. si alguien sabe mejor, me complacerá ver.
He resuelto este problema yo solo. pero es peculiar, muy peculiar. gSOAP genera clases de C ++ heredadas de struct soap
, 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;
para que podamos configurar los atributos necesarios (indicadores, params) como en la biblioteca OpenSSL por nosotros mismos. En caso simple, es suficiente llamar a soap_ssl_init()
una vez y establecer ssl_flags = SOAP_SSL_NO_AUTHENTICATION
. esto funciona para mi. si alguien sabe mejor manera voy gla
He usado soporte SSL en gsoap en mi programa c ++, y no he tenido problemas. 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.
He experimentado el mismo problema hoy. Estaba usando Ubuntu 14.04 en VirtualBox y Gsoap 2.8.21.
Genere clases proxy de C ++ con el comando:
soapcpp2 -1 -I/opt/libraries/gsoap/build/2.8.21/share/gsoap/import -C -j temporary.h
En primer lugar, utilicé la solución mencionada anteriormente y configuré ssl_flags en SOAP_SSL_NO_AUTHENTICATION. Gracias a este error desapareció.
Además, observé que al cambiar los indicadores a SOAP_TLSv1, también hace desaparecer los errores. 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 comencé a ver algo como:
SSL verifica error o advertencia con certificado en profundidad 1: no se puede obtener certificado de emisor local
La mejor solución que he encontrado hasta ahora es descargar el archivo cacerts.pem del sitio gsoap https://www.cs.fsu.edu/~engelen/cacerts.pem.zip y descomprimirlos junto al ejecutable.
Y, por supuesto, en tu código deberías 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 desaparecen todos los mensajes de advertencia y error.
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 del cliente generado utilizando gSOAP:
wsdl2h.exe -o MyWebservice.h ../MyWebservice.wsdl
soapcpp2.exe -IC:/gsoap-2.8/gsoap/import -j MyWebservice.h -C -1 -SL