как использовать SSL в C ++ сгенерированных классах gSOAP - PullRequest
7 голосов
/ 11 июня 2011

Мне нужно использовать библиотеку gsoap в C ++, и мне нужно использовать https.Документация говорит, как работать с HTTPS в C, но не в C ++ (в частности, http://www.cs.fsu.edu/~engelen/soapdoc2.html#tth_sEc19.20)., у меня есть ошибка компиляции в функции soap_ssl_init();. Я посмотрел файлы / usr / lib / libgsoap * и нашел ligsoapssl ++. файл исвязан с этим. Эта ошибка исчезла, но я получаю error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed. Это значит, что мне нужно вызвать soap_ssl_client_context func, но в сгенерированных классах C ++ этого нет. Что мне делать?

UPD:я решил эту проблему самостоятельно, но это изворотливый, очень изворотливый способ. gSOAP генерирует классы C ++, унаследованные от struct soap, он содержит следующие атрибуты:

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 сами. В простом случае достаточно один раз вызвать soap_ssl_init() и установить ssl_flags = SOAP_SSL_NO_AUTHENTICATION. У меня это работает. Если кто-нибудь знает лучший способ, я буду рад видеть.

Ответы [ 4 ]

1 голос
/ 11 апреля 2017

Это работает для меня:

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

где m_proxy - это экземпляр клиентского прокси, сгенерированный с использованием gSOAP:

wsdl2h.exe -o MyWebservice.h ..\MyWebservice.wsdl
soapcpp2.exe -IC:\gsoap-2.8\gsoap\import -j MyWebservice.h -C -1 -SL
1 голос
/ 12 июня 2011

Я решил эту проблему самостоятельно. но это причудливый, очень причудливый способ. gSOAP генерирует классы C ++, унаследованные от struct soap, и содержит следующие атрибуты:

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. В простом случае достаточно один раз вызвать soap_ssl_init() и установить ssl_flags = SOAP_SSL_NO_AUTHENTICATION. меня устраивает. если кто-нибудь знает лучший способ, я буду гла

0 голосов
/ 12 января 2015

Я столкнулся с той же проблемой сегодня.Я использовал Ubuntu 14.04 на VirtualBox и Gsoap 2.8.21.

Я сгенерировал прокси-классы C ++ с помощью команды:

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

Во-первых, я использовал вышеупомянутое решение и установил для ssl_flags значение SOAP_SSL_NO_AUTHENTICATION.Благодаря этой ошибке исчезли.

Более того, я заметил, что при изменении флагов на SOAP_TLSv1 ошибки также исчезают.Флаг, который вызывает головные боли, был SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION, который по умолчанию установлен внутри флага SOAP_SSL_DEFAULT.

Все выглядело нормально, пока я не перекомпилировал gsoap из источника с флагом --enable-debug.Вскоре после того, как я начал видеть что-то вроде:

Ошибка проверки 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";

Тогда все предупреждения и сообщения об ошибках исчезают.

0 голосов
/ 07 июня 2013

Я использовал поддержку SSL для gsoap в моей программе на С ++, и у меня не было проблем. Я скомпилировал исходный файл stdsoap2.cpp (который поставляется вместе с gsoap) с директивой -DWITH_OPENSSL (вы пропустили это?). Я использовал файл obj и связал с ним свою программу.

...