8

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

UPD:我自己解决了这个问题。但它很古怪,非常古怪的方式。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 库中一样自行设置必要的属性(标志、参数)。在简单的情况下,调用soap_ssl_init()一次并设置就足够了ssl_flags = SOAP_SSL_NO_AUTHENTICATION。这个对我有用。如果有人知道更好的方法,我会很高兴看到。

4

4 回答 4

3

这对我有用:

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
于 2017-04-11T14:07:21.927 回答
1

我自己解决了这个麻烦。但它很古怪,非常古怪的方式。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。这个对我有用。如果有人知道更好的方法,我会高兴

于 2011-06-12T09:24:53.823 回答
0

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

于 2013-06-07T08:51:56.763 回答
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 标志内。

一切似乎都很好,直到我使用标志 --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";

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

于 2015-01-12T16:56:10.797 回答