2011-06-11 65 views
6

我需要在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++生成的类中没有。我该怎么办?如何在C++ gSOAP中使用SSL生成的类

UPD:我自己解决了这个问题。但它古怪,非常古怪的方式。 gSOAP的生成从结构皂继承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; 

所以我们可以设置必要ATTRS(标志,则params),如由我们自己OpenSSL库。在简单情况下,拨打soap_ssl_init()一次并设置ssl_flags = SOAP_SSL_NO_AUTHENTICATION就足够了。这个对我有用。如果有人知道更好的方式,我会很高兴看到。

+2

什么是错误你得到:

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

其中m_proxy是客户端代理的实例使用gSOAP的产生? – Mat 2011-06-11 12:50:54

+0

'soap_ssl_init undefined reference'。我查看了/ usr/lib/libgsoap *文件并找到了ligsoapssl ++。文件并与之链接。这个错误已经消失了,但是我得到错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败。这意味着我需要调用'soap_ssl_client_context' func,但是没有C++生成的类。我该怎么办? – milo 2011-06-11 13:21:55

回答

0

我自己解决了这个问题。但它古怪,非常古怪的方式。 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(标志,则params)。在简单情况下,拨打soap_ssl_init()一次并设置ssl_flags = SOAP_SSL_NO_AUTHENTICATION就足够了。这个对我有用。如果有人知道更好的方式我会gla

+1

通过这样做,可以禁用服务器证书验证,这是建立安全SSL连接的要求。 – Bruno 2011-06-12 12:29:48

+0

是的,我知道。但是你可以在'const char * keyfile','const char * cafile'等设置合适的标志为'ssl_flags'和路径到keyfiles。 – milo 2011-06-13 03:32:08

+0

但是在你使用服务之前何时调用soap_ssl_init()? – 2011-06-13 14:52:19

0

我已经在我的c + +程序gsoap上使用SSL支持,我没有任何问题。我使用-DWITH_OPENSSL指令编译了源文件stdsoap2.cpp(它带有gsoap)(你错过了这个吗?)。我使用了obj文件,并将它与我的程序连接起来。

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标志内默认设置。

一切似乎都很好,直到我重新编译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"; 

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

1

这个工作对我来说:

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