WSO2 WS安全密码只能没有证书吗?

时间:2012-03-21 14:40:21

标签: php security wso2 rampart

我们想要创建一个使用WS Security的PHP WSO2 Webservice Client,但没有签名或加密。相反,我们想要使用简单的密码。问题是:我们总是得到证书错误(见下文)。我们真的必须安装证书,如果是这样的话:在哪里? Java Keystore?

环境:PHP 5.3.10,WSO2 PHP 2.10,Apache 2.2.x

wfs_client_log:

[error] key_mgr.c(295)[rampart] [rampart_signature]未指定公钥证书文件。 [error] rampart_signature.c(856)[rampart] [rampart_signature]无法获取证书 [error] rampart_sec_header_builder.c(131)[rampart] [shb]签名失败。错误 [error] rampart_sec_header_builder.c(601)[rampart] [shb]不对称绑定失败 [error] rampart_out_handler.c(130)[rampart]安全标题构建失败。 [error] phase.c(224)Handler RampartOutHandler在阶段安全性内调用失败 [error] 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);

3 个答案:

答案 0 :(得分:1)

终于成功了!现在可以调用Web服务(带有上面提到的vector / intent)。

Nandika的许多尝试和另一个例子后来我们发现,对于我们(Matthias和我)来说,改变WS-SecurityPolicy对象的创建就可以了。

而不是将上面的数组用作initialisation-parameter:

// 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中使用WSO2 WSF / PHP 2.1感觉相当敏感。因此,我会尝试列出一些知道(会有)帮助我节省时间的想法:

  • wsf / php反映给我的最常见错误是(带有消息的异常对象):“Error,NO Response Received”。现在几乎每当出现任何问题时都会发生这种情况,例如:

    • 我的request-xml(-structure)无效
    • 参数的类型不正确
    • webservice抛出异常(任何异常:因为错误的WS-Security用户/密码,缺少/未知的命名空间,甚至是'WS-Fault'类型的一些例外)
    • 服务方面出现了什么问题
    • php / wsf -side上的错误配置/配置更改,禁止任何相关的内容
    • 网络问题? (......未确认)
    • wso2没有发送请求(例如,当运输绑定 - 配置出现问题时)
  • 有时我会得到一个WS-Fault -ojbect(在resopnse信封中),我可以检查我的客户端代码[$ e typeof WSFault]

  • 总是有一个附近具有代理功能的工具来路由+检查您的请求和响应。目前我使用的是Oracles JDeveloper 10和11,它们内部都有一个简洁的“HTTP Analyzer”(但确实有更小和/或更好的工具用于此目的)。

  • 使用policy.xml中的设置和comrad,我发现:

    • 使用而不是所需的节点(在security_policy.xml中),您将获得WS-Fault:“策略需要身份验证令牌”
    • 有一个空节点导致连接在浏览器中终止并且wsf / php崩溃(没有重要的错误消息 - 据我所见)。

感谢大家(特别是Nandika)的帮助!

答案 1 :(得分:0)

我曾经遇到过同样的问题,但是它涉及WSServer,而不是WSClient。从版本2.1(甚至更早)开始,WSF考虑默认签名的WS-Policy,您需要一个声明无签名行为的WSPolicy文件。我发表了一篇关于这个主题的文章,但它是用俄语写的。使用Google翻译。

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

答案 2 :(得分:0)

默认生成的策略失败,因为wsf / php 2.1.0版本期望签名消息为默认生成的策略 $ policy = new WSPolicy(array(“security”=&gt; array(“useUsernameToken”=&gt; 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 = new WSPolicy($ policy_file);