WSO2 WS Security Password только без сертификата возможен?

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

Среда: 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]Сбой построения заголовка безопасности. [ошибка] 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);

person Matthias Ehrmann    schedule 21.03.2012    source источник


Ответы (3)


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

После многих попыток и еще одного примера Нандики мы обнаружили, что нам (Маттиасу и мне) помогло изменение создания объекта WS-SecurityPolicy.

Вместо использования вышеуказанного массива в качестве параметра инициализации:

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

... теперь мы используем xml-файл политики следующим образом:

// 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, это (объект-исключение с сообщением): «Ошибка, ответ не получен». Теперь это происходит почти всякий раз, когда что-то идет не так, например:

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

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

  • Поигравшись с настройками в policy.xml с товарищем выяснил что:

    • having a instead of the needed node (in your security_policy.xml) you'll get a WS-Fault: "policy requires authentication token"
    • наличие пустого узла приводит к прекращению соединения в браузере и сбою wsf/php (без существенного сообщения об ошибке - насколько я вижу).

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

person CuriousWalrus    schedule 21.05.2012

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

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

person Pavel Selitskas    schedule 21.03.2012
comment
большое спасибо. Я думаю, что это очень ценный намек. Я собираюсь проверить, работает ли это для нас. - person Matthias Ehrmann; 27.03.2012
comment
Обновление: Пока не смогли решить проблему... но будем бороться дальше - person Matthias Ehrmann; 12.04.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 = новый WSPolicy($policy_file);

person Nandika    schedule 16.04.2012
comment
Большое спасибо за подсказку, но теперь мы столкнулись с другой проблемой: [18 апреля 2012 г., 17:00:01] [предупреждение] msg_ctx.c(1384) Конфигурация RampartClientConfiguration не установлена ​​в контексте сообщения [18 апреля, 17:00:01]. 2012] [отладка] http_sender.c(494) msg_ctx_id:urn:uuid:2bfe4d64-8967-1e11-36bf-02ba3f0ab8d0 [18 апреля 17:00:01 2012] [отладка] http_transport_utils.c(3794) Карта сеанса не сохранена [18 апреля 2012 г., 17:00:01] [ошибка] http_sender.c(1330) Ошибка при передаче - person Matthias Ehrmann; 18.04.2012