0

usernameTokenを使用してパートナーWSに電話をかけようとしています。私はphp5.2.xの下でそのws02wsf_2.0.0に使用し、それは揺れ動きます。ここで、php5.3に基づく別のソリューションに移行したいと考えています。幸い、ws02はphp5.3と互換性のある2.1.0タグを提供します。この新しいリリースの新機能とドキュメント、特にusernameTokenについて読むのに時間をかけます。このリリースでは、証明書と秘密鍵を介したusernameTokenに関する署名が使用されていることを理解しました。AsymetricTransportBindingポリシーのb/cだと思います。私の場合、証明書などで署名したくありませんでした。また、ws02は、署名を回避するために、別のxmlファイルで一種のフォールバックを提供することも読みました。

多くの投稿を読んだ後、フォーラム私はコミュニティからの助けが必要ですb/c私は完全に立ち往生しています。

php5.3でWSをリクエストするために使用されるコードは次のとおりです-wsf2.1.0(HTTPを使用)

$policy   = new \WSPolicy( $policy ); ( $policy is the one from the call_back folder with a file_get_contents() )

$security = new \WSSecurityToken( array(
  'user'                    => 'my_username',
  'password'                => 'my_password',
  'passwordType'            => 'Digest',
  'ttl'                     => '300'
));

$this->oSoapClient = new \WSClient( array(
  wsdl:          http://www.xxx.xx/comparatorservices/CalculationService?WSDL
  to:            http://www.xxx.xx/comparatorservices/CalculationService
  useWSA:        true
  useSOAP:       1.1,
  policy:        $policy,
  securityToken: $security
));

$proxy = $this->oSoapClient->getProxy();
$response = $proxy->wykonajKalkulacje( $MySuperRequestObject );

このステップで:

  1. デバッグトレースをアクティブにしました(ログレベル4)
  2. 私の「to」がwsdl定義に従ってhttpを使用していることを確認します

    wsdl:port name = "CalculationServiceHttpPort" binding = "tns:CalculationServiceHttpBinding" wsdlsoap:address location = "http://www.xxxx.xx/comparatorservices/CalculationService" / wsdl:port

今、デバッグログから私はこれをキャッチします:

[Wed Jul 25 05:22:53 2012] [error] rampart_in_handler.c(91) [rampart]SOAP header cannot be found.
[Wed Jul 25 05:22:53 2012] [error] phase.c(224) Handler RampartInHandler invoke failed within phase Security
[Wed Jul 25 05:22:53 2012] [error] engine.c(657) Invoking phase Security failed
[Wed Jul 25 05:22:53 2012] [error] engine.c(262) Invoking operation specific phases failed for operation __OPERATION_OUT_IN__
[Wed Jul 25 05:22:53 2012] [error] /home/agruet/08_KRK_sources/wso2-wsf-php-src-2.1.0/src/wsf_wsdl.c(1226)      [wsf_wsdl] Response envelope not found

したがって、私の最初のアイデアは、トラフィック、特に動作中の(wsf_2.0.0 / php5.2.x)と壊れた(wsf_2.1.0 / php5.3)の間のSOAPヘッダーをスニッフィングすることでした。

これが2.0.0(動作中)です

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Header>
    <wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">

        <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
            <wsse:Username>my_username</wsse:Username>

            <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">
              hashed(my_password)
            </wsse:Password>

            <wsse:Nonce>hashed</wsse:Nonce>
            <wsu:Created>2012-07-26T20:40:26.991Z</wsu:Created>

        </wsse:UsernameToken>
    </wsse:Security>
</soapenv:Header>

そして2.1.0(動作していない/壊れている)

         <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
       <soapenv:Header>
         <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" soapenv:mustUnderstand="1">

        <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">

            <wsse:Username>my_username</wsse:Username>
            <wsse:Password
                Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">hashed(my_password)</wsse:Password>
            <wsse:Nonce>hashed</wsse:Nonce>
            <wsu:Created>2012-07-25T00:44:56.758Z</wsu:Created>
        </wsse:UsernameToken>
    </wsse:Security>
</soapenv:Header>

ご覧のとおり、唯一の違いはwsse:Security名前空間にあります。(xmlns:soapenv = "http://schemas.xmlsoap.org/soap/envelope/がありません)

そしてそれがすべてです...

デバッグログに従って91行目のrampart_in_handler.cを検査すると、次のようになります。

soap_header = axiom_soap_envelope_get_header(soap_envelope, env);
    if(!soap_header)
    {
        /*No SOAP header, so no point of proceeding. FAIL*/
        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[rampart]SOAP header cannot be found.");
        return AXIS2_FAILURE;
    }

意味ええ....soap_headerはfalseです..しかし、なぜですか?何が悪いのかを説明するための賢い人はいますか?

注1:動作中(2.0.0)からパートナーWSに送信されたポリシーを調べました。AsymetricBindingが使用されているようです...2.0.0で証明書またはキーを提供しなかった限り奇妙です。

注2:従来のWSPolicyオブジェクト配列パラメーターで署名付きユーザー名トークンを使用しようとしました-x509証明書とプライベートキーを作成し、関数を使用してこれらのファイルをロードし、配列パラメーターを使用してWSSecurityコンストラクターにロードしました...しかし私は同じエラーを受け取ります/スニッフィングは苦痛ですb/cデータが暗号化されているかそのようなものです(このように正常であるように見えます)

注3:現在、apt-getからコンパイル済みのphpパッケージを使用してUbuntu10.04-3LTSでテストされています

PLZヘルプ!

4

1 に答える 1

0

私はついに問題を見つけ、rampart_in_handler.c:91を修正しました

問題は要求からではなく応答から発生していました...私はtcpスニファを介して検査し、パートナーWSからの応答はsoap:Headerなしで行われました。

標準に準拠しているかどうかにかかわらず、前回のリリース(2.0.0)では機能していました。そこで、rampart_in_handler.cファイルのコードを少し調整して、soapヘッダーが欠落している場合に成功を返すことにしました...

私の意見では、私が間違っている場合、PLZは私を修正します:

soapHeader応答のテストは、asymetricBindingトランスポートと新しい署名されたusernametokenケースのb/cに確実に追加されました。ただし、(基本的なpolicy.xmlを介して)署名せずにusernametokenを使用する場合、応答はsoap:Headerなしで行われます。その後、城壁は常に失敗を返します...

また、wsfが応答を処理する方法に関してscripts /フォルダーの下のphpコードを分析し、このファイルで見ました:wsf_wsdl.php関数の下でwsf_process_response()

if($response_header_string && !empty($response_header_string)) {
    $header_dom = new DomDocument();
    $header_dom->preserveWhiteSpace = FALSE;
    $header_dom->loadXML($response_header_string);
}

php側では、データを受信すると、wsf / phpはsoapHeaderがない場合を想定します...(soapHeaderがない場合でも失敗はありません)超奇妙です!?

wsf_wsdl_serialization.php最後になりましたが、ファイルとファイルの両方に奇妙なバグが見つかりましたwsf_wsdl_deserialization.php

たとえば、次のような文字列でパラメータ/値を送信および/または受信することを計画している場合:

                            "110% Sigma of something" 

シリアライズ/アンシリアライズプロセス中に失敗し、セグメンテーション違反が発生します!

今、私はなぜ自分自身を疑問に思っていますか?しかし、最初のビューでは、確かに、「110%Sig ..」には「%S」が含まれており、「%s」はかなり閉じています...

このバグはここで言及されているものだと思います:

http://old.nabble.com/WSF-PHP-server-segfault-on-wsf_wsdl_serialization.php---td24329956.html

SをDまたは他の何かで変更すると、それは機能します...

なんて痛い…

于 2012-07-28T20:49:42.723 に答える