【问题标题】:WSO2 WS Security Password only without certificate possible?WSO2 WS 安全密码只有没有证书可能?
【发布时间】:2012-03-21 14:40:20
【问题描述】:

我们想创建一个使用 WS 安全性但没有签名和加密的 PHP WSO2 Web 服务客户端。相反,我们想使用一个简单的密码。问题是:我们总是收到证书错误(见下文)。我们真的必须安装证书吗?如果是的话:在哪里? Java 密钥库?

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

wfs_client_log:

[error] key_mgr.c(295) [rampart][rampart_signature] 未指定公钥证书文件。 [错误]rampart_signature.c(856) [rampart][rampart_signature] 无法获取证书 [错误]rampart_sec_header_builder.c(131) [rampart][shb] 签名失败。错误 [错误]rampart_sec_header_builder.c(601) [rampart][shb] 非对称绑定失败 [错误]rampart_out_handler.c(130) [rampart]安全标头构建失败。 [错误] phase.c(224) 处理程序 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);

【问题讨论】:

    标签: php security wso2 rampart


    【解决方案1】:

    终于成功了!调用 Web 服务(使用上述向量/意图)现在可以工作了。

    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 向我反映的最常见错误是(带有消息的异常对象):“错误,未收到响应”。现在几乎每当出现任何问题时都会发生这种情况,例如:

      • 我的 request-xml (-structure) 无效
      • 参数类型不正确
      • Web 服务引发异常(实际上是任何异常:可能是因为错误的 WS-Security 用户/密码、缺少/未知的命名空间,甚至是一些“WS-Fault”类型的异常)
      • 服务端真的出了什么问题
      • php/wsf 端的配置错误/配置更改不允许任何相关内容
      • 网络问题? (...未确认)
      • wso2 未发送请求(例如,当 TransportBinding -confinguration 出现问题时)
    • 有时我会收到一个 WS-Fault -ojbect(在响应信封中),我可以检查我的客户端代码 [$e typeof WSFault]

    • 总是在附近有一个具有代理功能的工具来路由 + 检查您的请求和响应。目前,我使用 Oracle JDeveloper 10 和 11,它们都有一个简洁的小型“HTTP 分析器”(但肯定有更小和/或更好的工具用于此目的)。

    • 玩弄 policy.xml 中的设置,我发现:

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

    感谢大家(尤其是 Nandika)的帮助!

    【讨论】:

      【解决方案2】:

      我曾经遇到过同样的问题,但它是关于 WSServer,而不是 WSClient。由于 2.1 版(或更早版本)WSF 认为 WS-Policy 默认已签名,因此您需要一个声明无签名行为的 WSPolicy 文件。我已经发布了一篇关于这个主题的文章,但它是用俄语写的。使用谷歌翻译。

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

      【讨论】:

      • 非常感谢。我认为这是一个非常有价值的提示。我正在检查这是否适合我们。
      • 更新:到目前为止,我们无法解决问题......但我们会继续努力
      【解决方案3】:

      默认生成的策略失败,因为 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 = new WSPolicy($policy_file);

      【讨论】:

      • 非常感谢您的提示,但现在我们遇到了另一个问题:[Wed Apr 18 17:00:01 2012] [warning] msg_ctx.c(1384) RampartClientConfiguration not set in message context [ 2012 年 4 月 18 日星期三 17:00:01] [调试] http_sender.c(494) msg​​_ctx_id:urn:uuid:2bfe4d64-8967-1e11-36bf-02ba3f0ab8d0 [2012 年 4 月 18 日星期三 17:00:01] [调试] http_transport_utils。 c(3794) 没有存储会话映射 [Wed Apr 18 17:00:01 2012] [error] http_sender.c(1330) 传输中发生错误
      猜你喜欢
      • 2018-12-03
      • 2014-02-20
      • 2018-05-28
      • 2017-12-23
      • 1970-01-01
      • 2011-09-28
      • 2014-04-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多