WSO2 WS Пароль безопасности только без сертификата возможно? - PullRequest
1 голос
/ 21 марта 2012

мы хотим создать клиент веб-сервиса PHP WSO2, который использует WS Security, но без подписи и шифрования. Вместо этого мы хотим использовать простой пароль. Проблема в том, что мы всегда получаем ошибку сертификата (см. Ниже). Нужно ли устанавливать сертификат, и если да, то где? Java Keystore?

Среда: PHP 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] Сбой подписания. ОШИБКА [ошибка] rampart_sec_header_builder.c (601) [rampart] [shb] Асимметричное связывание не удалось [ошибка] rampart_out_handler.c (130) [rampart] Ошибка построения заголовка безопасности. [error] phase.c (224) Ошибка вызова обработчика RampartOutHandler в фазе безопасности [error] engine.c (657) Фаза запуска Ошибка безопасности

PHP-код:

<code>  <?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 '
'; } catch (исключение $ e) { echo '

Ошибка:

'. PHP_EOL; var_dump ($ е); } // сбросить параметры мыла echo '

Параметр мыла

'. PHP_EOL; var_dump ($ soapPayload); // сбросить мыльный ответ echo '

Soap-Response

'. PHP_EOL; var_dump ($ soapResponse);

Ответы [ 3 ]

1 голос
/ 21 мая 2012

Наконец-то успешно!Вызов веб-службы (с указанным выше вектором / намерением) теперь работает.

Множество попыток и еще один пример, сделанный Нандикой, позже мы обнаружили, что для нас (Матиаса и меня) изменение создания объекта 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>

Начиная использовать WSO2 с WS-Security WSF / PHP 2.1 выглядит довольно обидно.Поэтому я попытаюсь перечислить некоторые мысли о том, что знание (могло бы) помогло мне сэкономить время:

  • Наиболее распространенная ошибка, отраженная для меня wsf / php: (объект исключения ссообщение): «Ошибка, ответ не получен».Теперь это происходит почти каждый раз, когда что-то идет не так, например:

    • мой request-xml (-structure) недействителен
    • параметр имеет неправильный тип
    • веб-служба выдает исключение (на самом деле любое исключение: будь то из-за неправильного пользователя / пароля WS-Security, отсутствующего / неизвестного пространства имен, даже некоторых исключений типа 'WS-Fault')
    • что-то идет не так вдействительно ли сервисная сторона
    • неверная конфигурация / изменение конфигурации на стороне php / wsf, которая запрещает что-либо относящееся к
    • сетевым проблемам?(... не подтверждено)
    • wso2 не отправляет запрос (например, при возникновении проблем с TransportBinding -confinguration)
  • иногда я получаюWS-Fault -ojbect (в конверте resopnse), который я могу проверить для своего клиентского кода [$ e typeof WSFault]

  • всегда есть инструмент с прокси-возможностями поблизости для маршрутизации через+ проверить ваш запрос и ответ.На данный момент я использую Oracles JDeveloper 10 и 11, в которых есть аккуратный маленький «HTTP Analyzer» (но для этой цели есть меньшие и / или лучшие инструменты).

  • Играя с настройками в policy.xml comrad, и я обнаружил, что:

    • имея вместо необходимого узла (в вашем security_policy.xml) вы получите WS-Fault:«политика требует токен аутентификации»
    • с пустым узлом приводит к разрыву соединения в браузере и краху wsf / php (без существенного сообщения об ошибке - насколько я вижу).

Спасибо всем (особенно Нандике) за помощь!

0 голосов
/ 16 апреля 2012

Сгенерированная по умолчанию политика терпит неудачу, потому что версия 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);

0 голосов
/ 21 марта 2012

Однажды я столкнулся с той же проблемой, но она касалась WSServer, а не WSClient.Поскольку версия 2.1 (или даже более ранняя) WSF учитывает WS-Policy, подписанную по умолчанию, вам нужен файл WSPolicy, который объявил поведение без подписи.Я разместил статью на эту тему, но она на русском языке.Используйте Google Translate.

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

...