comment utiliser SSL dans les classes générées par gSOAP C ++

J’ai besoin d’utiliser la bibliothèque gsoap en C ++ et d’utiliser https. la documentation explique comment utiliser HTTPS en C, mais pas en C ++ (http://www.cs.fsu.edu/~engelen/soapdoc2.html#tth_sEc19.20). en particulier, j’ai une erreur de soap_ssl_init(); sur soap_ssl_init(); une fonction. J’ai examiné les fichiers / usr / lib / libgsoap * et trouvé ligsoapssl ++. un fichier et lié à celui-ci. cette erreur a disparu, mais je reçois l’ error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificatee verify failed . cela signifie que j’ai besoin d’appeler soap_ssl_client_context func, mais il n’y a pas de classes générées par C ++. Que devrais-je faire?

UPD: J’ai résolu ce problème par moi-même. mais c’est bizarre, très bizarre. gSOAP génère des classes C ++ héritées de struct soap, il contient les atsortingbuts suivants:

 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; 

nous pouvons donc configurer nous-mêmes les atsortingbuts (drapeaux, parameters) nécessaires, comme dans la bibliothèque OpenSSL. Dans un cas simple, il suffit d’appeler soap_ssl_init() une fois et de définir ssl_flags = SOAP_SSL_NO_AUTHENTICATION . ça marche pour moi. Si quelqu’un sait mieux, je serai heureux de voir.

Cela fonctionne pour moi:

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

où m_proxy est une instance du proxy client générée à l’aide de gSOAP:

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

J’ai résolu ce problème par moi-même. mais c’est bizarre, très bizarre. gSOAP génère des classes C ++ héritées de struct soap , il contient les atsortingbuts suivants:

 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; 

nous pouvons donc configurer nous-mêmes les atsortingbuts (drapeaux, parameters) nécessaires, comme dans la bibliothèque OpenSSL. Dans un cas simple, il suffit d’appeler soap_ssl_init() une fois et de définir ssl_flags = SOAP_SSL_NO_AUTHENTICATION . ça marche pour moi. si quelqu’un sait mieux je vais gla

J’ai utilisé le support SSL sur gsoap dans mon programme c ++ et je n’ai eu aucun problème. J’ai compilé le fichier source stdsoap2.cpp (qui vient avec gsoap), avec la directive -DWITH_OPENSSL (avez-vous oublié cela?). J’ai utilisé le fichier obj et lié mon programme avec.

J’ai connu le même problème aujourd’hui. J’utilisais Ubuntu 14.04 sur VirtualBox et Gsoap 2.8.21.

J’ai généré des classes de proxy C ++ avec la commande:

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

Dans un premier temps, j’ai utilisé la solution susmentionnée et défini ssl_flags sur SOAP_SSL_NO_AUTHENTICATION. Merci à cette erreur a disparu.

De plus, j’ai observé que lorsqu’on modifiait les indicateurs en SOAP_TLSv1, les erreurs disparaissaient également. L’indicateur à l’origine des maux de tête était SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION, défini par défaut dans l’indicateur SOAP_SSL_DEFAULT.

Tout semblait aller bien, jusqu’à ce que je recomstack gsoap à partir de la source avec flag –enable-debug. Peu après, j’ai commencé à voir quelque chose comme:

Erreur de vérification SSL ou avertissement avec certificate en profondeur 1: impossible d’obtenir le certificate de l’émetteur local

La meilleure solution que j’ai trouvée jusqu’à présent consiste à télécharger le fichier cacerts.pem à partir du site gsoap https://www.cs.fsu.edu/~engelen/cacerts.pem.zip et à le décompresser en regard de votre exécutable.

Et bien sûr, dans votre code, vous devriez avoir quelque chose de similaire à:

 soap *soap = soap_new(); soap->ssl_flags = SOAP_SSL_DEFAULT; soap_register_plugin(soap, soap_wsse); soap->cafile = "cacerts.pem"; 

Ensuite, tous les messages d’avertissement et d’erreur disparaissent.