1

WS Security を使用する PHP WSO2 Webservice Client を作成したいと考えていますが、署名も暗号化もありません。代わりに、単純なパスワードを使用します。問題は、常に証明書エラーが発生することです (以下を参照)。本当に証明書をインストールする必要がありますか? もしそうなら: どこに? Java キーストア ?

環境: PH​​P 5.3.10、WSO2 PHP 2.10、Apache 2.2.x

wfs_client_log:

[エラー] key_mgr.c(295) [rampart][rampart_signature] 公開鍵証明書ファイルが指定されていません。[エラー] rampart_signature.c(856) [rampart][rampart_signature] 証明書を取得できません [エラー] rampart_sec_header_builder.c(131) [rampart][shb] 署名に失敗しました。ERROR [エラー] Rampart_sec_header_builder.c(601) [rampart][shb] 非対称バインディングに失敗しました [エラー] ranpart_out_handler.c(130) [rampart]セキュリティ ヘッダーの構築に失敗しました。[エラー] phase.c(224) Handler RampartOutHandler の呼び出しがフェーズ セキュリティ内で失敗しました [エラー] engine.c(657) フェーズ セキュリティの呼び出しに失敗しました

PHPコードは次のとおりです。

  <?php
    // Endpoint WebService
    $endPoint       = 'http://xxx.xxxx.xxx:7000/orabpel/selfservice/passwortAendernMBE/1.0';

    // Security-Payload
    $user           = 'mustermann123';
    $passwortAlt    = 'foo';
    $passwortNeu    = 'bar';

    // create Security-Token 
    $secToken       = new WSSecurityToken(array(
                                                    "user" => $user,
                                                    "password" => $passwortAlt,
                                                    "passwordType" => "PlainText"));
    // create SecurityPolicy 
    $policy         = new WSPolicy(array(
                                                    "security" => array(
                                                            "useUsernameToken" => TRUE)));
    // create WS-Client 
    $client         = new WSClient( array(
                                                    "to" => $endPoint,
                                                    "useSOAP" => "1.1",
                                                    "action" => "process",
                                                    "policy" => $policy,
                                                    "securityToken" => $secToken));
    // create SOAP-Payload
    $soapPayload = '
            <ns1:passwortAendern_processElement xmlns:ns1="http://xxxx.xxxx.xxxxxe/Integration/prozesse/xxxxxxSchema"
            xmlns:ns2="http://xxxx.xxxx.xxx/types/xx.xxx.xxxx.selfService.prozesse.xxx.xxxxMessage">
                    <ns1:passwortAendernMessage>
                            <ns2:benutzerkennung>' . $user . '</ns2:benutzerkennung>
                            <ns2:passwortAlt>' . $passwortAlt . '</ns2:passwortAlt>
                            <ns2:passwortNeu>' . $passwortNeu . '</ns2:passwortNeu>
                    </ns1:passwortAendernMessage>
            </ns1:passwortAendern_processElement>';

    // Request
    $soapResponse = null;
    try {
            // soap Request 
            $soapResponse   = $client->request( $soapPayload );

            // print out Response
            echo '<pre>';
            print_r(htmlspecialchars( str_replace('>','>'.PHP_EOL,$soapResponse->str ) ));
            echo '</pre>';

    } catch(Exception $e) {
            echo '<h1>Error:</h1>' . PHP_EOL;
            var_dump($e);
    }

// dump Soap-Parameters
echo '<h1>Soap-Parameter</h1>' . PHP_EOL;
var_dump($soapPayload);

// dump Soap-Response
echo '<h1>Soap-Response</h1>' . PHP_EOL;
var_dump($soapResponse);
4

3 に答える 3

1

ついに成功!Webservice の呼び出し (上記のベクトル/インテントを使用) が機能するようになりました。

多くの試みと Nandika による別の例を後で調べたところ、私たち (Matthias と私) にとっては WS-SecurityPolicy オブジェクトの作成を変更することでうまくいったことがわかりました。

上記の配列を初期化パラメータとして使用する代わりに:

// create SecurityPolicy 
$policy  = new WSPolicy(array(
                 "security" => array(
                       "useUsernameToken" => TRUE)));

...次のように xml-policy-file を使用します。

// load Policy (xml) file...
$policy_file = file_get_contents("policy.xml");

// ...and create SecurityPolicy
$policy = new WSPolicy($policy_file);

「policy.xml」の内容:

<wsp:Policy xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
    <wsp:ExactlyOne>
        <wsp:All>
            <sp:TransportBinding>
                <wsp:Policy>
                </wsp:Policy>
            </sp:TransportBinding>
            <sp:SignedSupportingTokens>
                <wsp:Policy>
                    <sp:UsernameToken
                        sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
                        <wsp:Policy>
                            <sp:WssUsernameToken10 />
                        </wsp:Policy>
                    </sp:UsernameToken>
                </wsp:Policy>
            </sp:SignedSupportingTokens>
        </wsp:All>
    </wsp:ExactlyOne>
</wsp:Policy>

WS-Security WSF/PHP 2.1 で WSO2 を使い始めるのは、かなり面倒です。したがって、知っていれば時間の節約に役立つ (だったはずの) 考えをいくつかリストアップしてみます。

  • wsf/php によって私に反映される最も一般的なエラーは (メッセージを含む例外オブジェクト): "Error , NO Response Received" です。これは、何か問題が発生したときにほぼ常に発生します。たとえば、次のようになります。

    • 私の request-xml (-structure) が無効です
    • パラメータの型が正しくありません
    • Web サービスが例外をスローします (実際には、WS-Security のユーザー/パスワードが間違っている、ネームスペースが見つからない/不明な、タイプ「WS-Fault」のいくつかの例外が原因であるなどの例外があります)。
    • サービス側で実際に問題が発生した場合
    • php/wsf 側での構成ミス/構成変更 - 関連するものを許可しない
    • ネットワークの問題?(...確認されていません)
    • wso2 からリクエストが送信されない (たとえば、TransportBinding -configuration に問題がある場合)
  • ときどき WS-Fault -ojbect を (resopnse エンベロープで) 受け取ることがあります。これでクライアント コードを確認できます [$e typeof WSFault]

  • プロキシ機能を備えたツールを常に近くに置いて、ルーティングし、リクエストとレスポンスを検査してください。現時点では、Oracles JDeveloper 10 と 11 を使用していますが、どちらもきちんとした小さな "HTTP アナライザー" を備えています (ただし、この目的のために、より小型で優れたツールが存在することは確かです)。

  • 同志である policy.xml の設定をいじってみると、次のことがわかりました。

    • 必要なノードの代わりに (security_policy.xml に) あると、WS-Fault: "ポリシーには認証トークンが必要です" が表示されます。
    • 空のノードを持つと、ブラウザーで接続が終了し、wsf/php がクラッシュします (重大なエラー メッセージなし - 私が見る限り)。

皆さん(特にNandika)、助けてくれてありがとう!

于 2012-05-21T15:48:59.620 に答える
0

wsf/php 2.1.0 バージョンは $policy = new WSPolicy(array( "security" => array("useUsernameToken" => TRUE)));

次のポリシー ファイルを試してください。 https://svn.wso2.org/repos/wso2/trunk/wsf/php/samples/security/username_token/call_back/policy.xml

ポリシーは次のようにロードできます $policy_file = file_get_contents("policy.xml"); $policy = 新しい WSPolicy($policy_file);

于 2012-04-16T07:03:28.570 に答える
0

私は一度同じ問題に遭遇しましたが、それは WSClient ではなく WSServer に関するものでした。バージョン 2.1 (またはそれ以前) の WSF では、WS-Policy がデフォルトで署名されていると見なされるため、署名のない動作を宣言した WSPolicy ファイルが必要です。このトピックに関する記事を投稿しましたが、ロシア語です。Google 翻訳を使用します。

http://habrahabr.ru/post/132353/

于 2012-03-21T15:29:51.567 に答える