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_context、funcを呼び出す必要がありますが、C++で生成されたクラスにはありません。私は何をすべきか?

UPD:私はこの問題を自分で解決しました。しかし、それは風変わりで、非常に風変わりな方法です。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ライブラリのように必要な属性(フラグ、パラメータ)を自分で設定できます。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です。わたしにはできる。誰かがより良い方法を知っているなら私はgla

于 2011-06-12T09:24:53.823 に答える
0

私はc++プログラムのgsoapでSSLサポートを使用しましたが、問題はありませんでした。ソースファイルstdsoap2.cpp(gsoapに付属)を-DWITH_OPENSSLディレクティブを使用してコンパイルしました(これを見逃しましたか?)。objファイルを使用して、プログラムをリンクしました。

于 2013-06-07T08:51:56.763 に答える
0

私は今日同じ問題を経験しました。私はVirtualBoxとGsoap2.8.21でUbuntu14.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を再コンパイルするまで、すべてが正常に見えました。私が次のようなものを見始めた直後に:

深さ1の証明書でSSL検証エラーまたは警告:ローカル発行者証明書を取得できません

これまでに見つけた最善の解決策は、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 に答える