1

標準の http と https の両方のバージョンを持つサービスに対して gSoap クライアント アプリケーションを作成しています。これまでに書いたものはすべて http サービスで正常に動作しますが、https サービスに切り替えると、突然エラーが発生します。

https サポートのコードに加えた唯一の変更は、起動時に次を追加することでした。

 soap_ssl_init();   
 if(soap_ssl_client_context(&_tradeService, SOAP_SSL_SKIP_HOST_CHECK, NULL, NULL, NULL, NULL, NULL)) {
     handleError("Failed to set up SSL connection");
     return;
 }

フラグを-DDEBUGオンにすると、証明書に関するエラーが表示されます。「深さ 2 の証明書で SSL 検証エラーまたは警告: 証明書チェーンの自己署名証明書」soap_ssl_client_contextエラーを返す原因にはなりませんが、そうではないと思います私がテストしている間は、ホストを認証することをあまり気にしていないので、大したことです。

本当の問題は次のエラーです。

SOAP 1.2 エラー: SOAP-ENV:Sender [サブコードなし] "有効なアクション パラメータがないと要求を処理できません。有効な SOAP アクションを指定してください。"

サービスにリクエストをしようとすると得られます。gsoap が生成する送信ログを見ると、送信ヘッダーに SoapAction パラメータが設定されていることがわかります。実際、http/https サービスの送信ログを比較すると、唯一の違いは、安全なサービスの URL の前に https が付いていることです。

次に、サーバーで何かが台無しになっているのではないかと考えたので、curl を使用して、gsoap が送信したものとまったく同じ XML データを、まったく同じヘッダーで送信しました。これは正常に動作し、期待するデータで通常の応答が見られます。これにより、SSL の設定が間違っているのではないかと思われます。

ドキュメントにない他の問題は、-DWITH_OPENSSL -lgsoapssl++ -lssl -lcryptoフラグを使用してビルドしたときに、gsoap の ssl メソッドに関するリンカー エラーがまだ発生していたことです。stdsoap2_ssl_cpp.cppこれらを解決するには、ビルドに含める必要がありましたが、これは奇妙だと思いました。

誰かが私にいくつかの指針を与えることができる前にこれをやろうとしましたか?

4

2 に答える 2

0

同時に同様の問題と戦っているようです。

最初にこれから始めましょう:

ドキュメントにない他の問題は、 -DWITH_OPENSSL -lgsoapssl++ -lssl -lcrypto フラグを使用してビルドしたときに、gsoap の ssl メソッドに関するリンカー エラーがまだ発生していたことです。これらを解決するには、ビルドに stdsoap2_ssl_cpp.cpp を含める必要がありましたが、これは奇妙だと思いました。

参考までに、Ubuntu 14.04 の VirtualBox を使用しています。フラグ--enable-debugおよび--with-openssl=/opt/libraries/openssl/build/1.0.1jを使用してソースから Gsoap 2.8.21 をコンパイルしました。

ご覧のとおり、 libssl.aおよびlibcrypto.aアーカイブを取得するために、ソースから openssl もコンパイルしました。さらに、 libz.aアーカイブを取得するために zlib をコンパイルしました。それらをすべて配置すると、次のようになります。

  • 次のコマンドを使用して、WSDL からヘッダー ファイルを生成しました。

    wsdl2h -v -g -o temporary.h https://something.com?wsdl
    
  • プロキシ クラスを生成する前に、temporary.h に次の行を追加します。

    #import "wsse.h"
    
  • 次のコマンドで生成された C++ プロキシ クライアント クラス:

    soapcpp2 -1 -I/opt/libraries/gsoap/build/2.8.21/share/gsoap/import -C -j temporary.h
    
  • QT Creator (Plain Project、残念ながら cmake はありません) を使用すると、私の project.pro ファイルは次のようになります。

    TEMPLATE = app
    CONFIG += console
    CONFIG -= app_bundle
    CONFIG -= qt
    
    QMAKE_CXXFLAGS += -DWITH_OPENSSL
    QMAKE_CXXFLAGS += -DWITH_DOM
    QMAKE_CXXFLAGS += -DDEBUG
    
    QMAKE_CFLAGS += -DWITH_OPENSSL
    QMAKE_CFLAGS += -DWITH_DOM
    QMAKE_CFLAGS += -DDEBUG
    
    SOURCES += main.cpp \
        soapBasicHttpBinding_USCOREIBarcodeWebServiceProxy.cpp \
        soapC.cpp \
        ../../../opt/libraries/gsoap/build/2.8.21/share/gsoap/plugin/wsseapi.cpp \
        ../../../opt/libraries/gsoap/build/2.8.21/share/gsoap/plugin/mecevp.c \
        ../../../opt/libraries/gsoap/build/2.8.21/share/gsoap/plugin/smdevp.c \
    
    HEADERS += \
        BasicHttpBinding_USCOREIBarcodeWebService.nsmap \
        soapBasicHttpBinding_USCOREIBarcodeWebServiceProxy.h \
        soapStub.h \
        soapH.h
    
    include(deployment.pri)
    qtcAddDeployment()
    
    INCLUDEPATH += ../../../opt/libraries/gsoap/build/2.8.21-debug/share/gsoap
    
    unix:!macx: LIBS += -L$$PWD/../../../opt/libraries/gsoap/build/2.8.21-debug/lib/ -lgsoapssl++
    INCLUDEPATH += $$PWD/../../../opt/libraries/gsoap/build/2.8.21-debug/include
    DEPENDPATH += $$PWD/../../../opt/libraries/gsoap/build/2.8.21-debug/include    
    unix:!macx: PRE_TARGETDEPS += $$PWD/../../../opt/libraries/gsoap/build/2.8.21-debug/lib/libgsoapssl++.a
    
    unix:!macx: LIBS += -L$$PWD/../../../opt/libraries/openssl/build/1.0.1j/lib/ -lssl
    INCLUDEPATH += $$PWD/../../../opt/libraries/openssl/build/1.0.1j/include
    DEPENDPATH += $$PWD/../../../opt/libraries/openssl/build/1.0.1j/include
    unix:!macx: PRE_TARGETDEPS += $$PWD/../../../opt/libraries/openssl/build/1.0.1j/lib/libssl.a
    
    unix:!macx: LIBS += -L$$PWD/../../../opt/libraries/openssl/build/1.0.1j/lib/ -lcrypto
    INCLUDEPATH += $$PWD/../../../opt/libraries/openssl/build/1.0.1j/include
    DEPENDPATH += $$PWD/../../../opt/libraries/openssl/build/1.0.1j/include
    unix:!macx: PRE_TARGETDEPS += $$PWD/../../../opt/libraries/openssl/build/1.0.1j/lib/libcrypto.a
    
    unix:!macx: LIBS += -L$$PWD/../../../opt/libraries/zlib/build/1.2.8/lib/ -lz
    INCLUDEPATH += $$PWD/../../../opt/libraries/zlib/build/1.2.8/include
    DEPENDPATH += $$PWD/../../../opt/libraries/zlib/build/1.2.8/include
    unix:!macx: PRE_TARGETDEPS += $$PWD/../../../opt/libraries/zlib/build/1.2.8/lib/libz.a
    
    LIBS += -ldl
    

質問の最初の部分に答えると、現在直面している問題は次のガイドで解決できるはずです。

参考までに、main.cpp ファイルに以下を含めました。

#include <iostream>
#include "BasicHttpBinding_USCOREIBarcodeWebService.nsmap"
#include "soapBasicHttpBinding_USCOREIBarcodeWebServiceProxy.h"
#include "soapStub.h"
#include "soapH.h"
#include "plugin/wsseapi.h"

そして後で追加したファイルで:

// creating empty soap struct with SOAP_IO_FLUSH
soap *soap = soap_new();
// setting flags: SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION | SOAP_TLSv1
soap->ssl_flags = SOAP_SSL_DEFAULT;
// registering plugin
soap_register_plugin(soap, soap_wsse);
// file with CA certs of peers (downloaded https://www.cs.fsu.edu/~engelen/cacerts.pem.zip)
soap->cafile = "cacerts.pem";
// I placed cacerts.pem file in the same folder where your program executable will be created

あなたのケースに戻って、soap_ssl_client_contextを使用する方法で、パラメータの 1 つがcacerts.pemの場所の設定にも関与していると思います。

それでもうまくいかない場合は、いつでも ssl_flags をSOAP_SSL_NO_AUTHENTICATIONに設定できます

これがこの問題を解決できるかどうかはわかりません:

SOAP 1.2 エラー: SOAP-ENV:Sender [サブコードなし] "有効なアクション パラメータがないと要求を処理できません。有効な SOAP アクションを指定してください。"

ただし、gsoap プラグインから適切なファイルを添付する場合があります。私は SOAP 1.1 で遊んでいて、SOAP 1.2 のプロキシ クライアント クラスの生成を無効にしていました。

とにかく、私はあなたの反応を楽しみにしています。初めて Gsoap を扱うときのフラストレーションを少しでも解消できれば幸いです :)

于 2015-01-12T19:08:01.343 に答える