如何在C ++ gSOAP生成的类中使用SSL

时间:2011-06-11 12:48:05

标签: c++ ssl https gsoap

我需要在C ++中使用gsoap库,我需要使用https。文档说明了如何在C中使用HTTPS,但在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生成继承自struct soap的C ++类,它包含以下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;

所以我们可以自己在OpenSSL库中设置必要的attrs(flags,params)。在简单的情况下,只需拨打soap_ssl_init()一次并设置ssl_flags = SOAP_SSL_NO_AUTHENTICATION即可。这个对我有用。如果有人知道更好的方式,我很乐意看到。

4 个答案:

答案 0 :(得分:1)

我自己解决了这个问题。但它是古怪的,非常古怪的方式。 gSOAP生成从struct soap继承的C ++类,它包含以下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;

所以我们可以自己在OpenSSL库中设置必要的attrs(flags,params)。在简单的情况下,只需拨打soap_ssl_init()一次并设置ssl_flags = SOAP_SSL_NO_AUTHENTICATION即可。这个对我有用。如果有人知道我会更好的方式

答案 1 :(得分:1)

这对我有用:

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

答案 2 :(得分:0)

我在c ++程序中使用了gsoap上的SSL支持,我没有遇到任何问题。我使用-DWITH_OPENSSL指令编译了源文件stdsoap2.cpp(随gsoap一起提供)(你错过了吗?)。我使用了obj文件,并将我的程序与它联系起来。

答案 3 :(得分:0)

我今天遇到了同样的问题。我在VirtualBox和Gsoap 2.8.21上使用Ubuntu 14.04。

我用命令生成了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标志内设置。

一切似乎都很好,直到我使用flag --enable-debug从源代码重新编译gsoap。我开始看到类似的东西后不久:

SSL验证错误或警告,证书深度为1:无法获取本地颁发者证书

我到目前为止找到的最佳解决方案是从gsoap网站https://www.cs.fsu.edu/~engelen/cacerts.pem.zip下载cacerts.pem文件并将其解压缩到您的可执行文件旁边。

当然,在你的代码中你应该有类似的东西:

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

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

然后所有警告和错误消息都消失了。