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

how to use SSL in C++ gSOAP generated classes

本文关键字:SSL C++gSOAP      更新时间:2023-10-16

我需要在C++中使用gsoap库,我需要使用https。文档说明了如何在C中使用HTTPS,而不是在C++中(http://www.cs.fsu.edu/~engelen/soapdoc2.html#tth_sec192.20)。特别是,我在soap_ssl_init();函数上有计算错误。我查看了/usr/lib/libgsoap*文件,找到了ligsoapssl++.a文件并链接到它。这个错误已经消失,但我得到了error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed。这意味着我需要调用soap_ssl_client_context函数,但在C++生成的类中没有。我该怎么办?

乌干达人民国防军:我自己解决了这个问题。但这是一种非常古怪的方式。gSOAP生成继承自structsoap的C++类,它包含以下属性:

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就足够了。它对我有用。如果有人知道更好的方法,我会很高兴看到的。

这对我有效:

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.8gsoapimport -j MyWebservice.h -C -1 -SL

我自己解决了这个问题。但这是一种非常古怪的方式。gSOAP生成继承自struct soap的C++类,它包含以下属性:

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就足够了。它对我有效。如果有人知道更好的方法,我会gla

我在c++程序中使用了对gsoap的SSL支持,没有遇到任何问题。我使用-DITH_OPENSSL指令编译了源文件stdsoap2.cpp(它与gsoap一起提供)(您错过了吗?)。我使用了obj文件,并将我的程序与之链接。

我今天也遇到了同样的问题。我在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——enabledebug。不久之后,我开始看到类似的东西:

SSL验证错误或警告与深度1的证书:无法获得本地颁发者证书

到目前为止,我找到的最好的解决方案是从gsoap站点下载cacerts.pem文件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";

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