Реализация спецификации WS-Security для SOAP в PHP существует?

miha

Новичок
Реализация спецификации WS-Security для SOAP в PHP существует?

Добрый день,

Я не являюсь программистом на PHP, но создаю WebServices на другой платформе и использую для защиты реализацию WS-Security. На платформах Java & .NET существуют библиотеки в которых уже реализован протокол.

Столкнулся с тем, что необохдимо создать клиента на PHP для сервиса, который закрыт протоколом WS-Security.
Поискал в Интернет и ничего не нашел. Такое ощущение что никто не реализует таких вещей.

Не подскажут гуру PHP что в этом направлении есть и куда копать?
 

Alexandre

PHPПенсионер
нет, я собираюсь ее реализовать, есть масса набросков (реализована авторизация WEB службы как расширение модуля php_xmlsec , но хочу выделить в отдельный модуль, хотя я от этого впоследствии отказался, см. ниже пояснение.), пока выбираю необходимое решение.

в настоящее время реализован протокол XMLEncryption & XMLDSign

В настоящее время пишу модуль авторизации WEB службы для апача - это менее ресурсоемкое,
ну и помимо пхп можно использовать в питоне или рубби.

Если нужно шифрование, то можно тоже сделать через модуль апача, а в пхп использовать уже родные ср-ва через SOAP, но пока реализовать бы авторизацию.

что конкретно в WS-Security тебя интересует?
весь протокол можно реализовать средствами РНР или php_xmlsec расширением.

Так же мной написана статья в Системном Администраторе (апрель 2007) "Реализация защиты WEB служб средствами РНР" Там используется libxmlsec в комаднаной строке. Веся спецификация WS-Security разложена по полочкам и как это все реализовать. На phpclasses.org есть пример класса (еще для PHP4), см. как образец. ;)
хотел сделать для пхп5 для WS-Security, но потом решил все-же реализовать как модуль апача.

Если будешь соберешься сделать подобный класс нап пхп для WS-Security, обязательно прочти статью, так как есть подводные камни именно с реализацией этого протокола.

Радует, что к этой теме проявляется интерес не только за пределами нашей необъятной Родины.
 

miha

Новичок
Я использую из WS-Security цифровые подписи и шифрование с помощью сертификатов X.509

Я работаю сейчас на платформе .NET и там это очень грамотно реализовано в WSE 3.0 от Microsoft.

Т.е. мои клиенты, которые работают на платформе Java or .Net проблем не знают. Но вот появился клиент, который работает на PHP - вот думаю сейчас что проще:
1. Реализовать на PHP WS-Security клиенту
2. Реализовать proxy сервис на .Net, который будет установлен у клиента и оборачивать его открытые запросы в протокол WS-Security

Вторую задачу оцениваю в неделю. Весь вопрос что будет стоить реализация WS-Security на PHP.
 

Alexandre

PHPПенсионер
Я работаю сейчас на платформе .NET и там это очень грамотно реализовано в WSE 3.0 от Microsoft
я в курсе, пытаюсь добиться совместимости
1. Реализовать на PHP WS-Security клиенту
тоже где-то неделя... при грамотной подготовки дня три.
но советую вариант 2, так как ты все уже знаешь, если обертка не оччень будет геморна для клиента.

PS. я в первом посте сделал добавления.
 

miha

Новичок
Кусочек Вашей статьи я кстати видел вчера, но всю прочитать не смог поскольку она закрыта в Интернет для публичного доступа. Если правила не запрещают можео увидеть целиком статью?

-~{}~ 18.09.07 23:06:

А скажите, возможно ли сотрудничество в этом направлении? Если я дам Ваши координаты клиенту, сможет ли он сделать аутсорсинг этой задачи Вам?
 

Alexandre

PHPПенсионер
ася в профайле,
остальное Сообществу будет не интересно
 

Flyer

Новичок
Приветствую, за прошедшее время появилось что то интересное под WSE и PHP?

может кто поделиться примером реализации?
Заранее спасибо.
 

Flyer

Новичок
Спасибо большое, буду изучать.

-~{}~ 11.09.08 17:50:

в первой ссылке были использованы только те классы?
без специфических настроек сервера?
 

miha

Новичок
Не могу сказать - я сам не программирую на php. Знаю что люди за сутки разобрались - видимо там ничего сложного.
 

Alexandre

PHPПенсионер
в настоящее время, я совместно с Дмитрием Стоговым (автор soap модуля) дорабатываю soap-модуль
приделываю Ws-Autentification на первом этапе, потом будет Ws-Encryption
работа идет медленно, в этом году точно ничего не будет...

в первой ссылке были использованы только те классы?
без специфических настроек сервера?
да, эта библиотека использует php_openssl, php_mcrypt

приятно, что тема кого-то еще интересует,
будет спрос - работа пойдет быстрее...
 

DiMoN_TD

Новичок
Alexandre
Здравствуйте!
У меня стоит задача подключиться к серверу защищенный WSE технологией + SSL.

У сервера есть несколько сервисов, т.е. несколько функций. Моя задача передать некую информацию в функцию и получить некий ответ.

В самом начале, я думал что пойдет данный код:
PHP:
/*Это я так предполагаю создание некого header'a*/
$client = new SoapClient("some.wsdl", 
array('login'                => "some_name",
          'password'       => "some_password",
          'local_cert'        => "servercert"));

/*Далее (видимо выше подключившь к сервису) я пытаюсь вызвать функцию и передать необходимые данные*/

$client->__call('SomeFunction',
                                                 array('first_atribute' => 'value1',                                             
                                                            'second_atribute' => 'value2'));
Все. Ведь по идее для подключения к сервису, защищенному SSL и WSE, данной информации должно хватать. Но вот почему-то мне отдает ошибку:

Warning: SoapClient::SoapClient() [soapclient.soapclient]: Unable to set local cert chain file `/data/certificates/certif.cer'; Check that your cafile/capath settings include details of your certificate and its issuer in /data/www/somescript.php on line 42

Warning: SoapClient::SoapClient() [soapclient.soapclient]: failed to create an SSL handle in /data/www/somescript.php on line 42

Warning: SoapClient::SoapClient() [soapclient.soapclient]: Failed to enable crypto in /data/www/somescript.php on line 42

Сертификат СТО ПРОЦЕНТОВ верный. Что тут может быть не так? Уже читал на форуме, что могут возникать какие-то подобные проблемы с использованием сертификатов, но должного разъяснения как обойти данную проблему так и не нашел :(

Очень нужна Ваша помощь.

-~{}~ 16.09.08 14:27:

Хм.. установил данную библиотеку на сервак: http://wso2.org/projects/wsf/php

Там все хорошо расписано, но что-то у меня не получается зайти на сервер сервиса. Т.е. никак не могу въехать, какие там нужно указать атрибуты и, главное, как правильно их указать!?

Т.е. там должно быть по идее по пунктам:
1) Создать некий header (для ауентицикации в wsdl'е)
2) Создать XML запрос.
3) Подключить сертификат (напоминаю, в обычном браузере, при заходе на веб-сервис, необходимо лишь подтвердить согласие с данным сертификатом, т.е. тут не требуется никаких приватных ключей).
4) Отправить запрос именно на тот сервис, т.е. на интересующую меня функцию.
5) Получить и распарсить ответ (но главное пока что для меня получить).

Если кто встречался с данной библиотекой, и может ткнуть меня носом в определенные функции для реализации подключения к защищенному серверу, буду очень благодарен! :)

-~{}~ 16.09.08 16:36:

Кто может мне объяснить, в чем разница параметра "to" и "action" в данном коде?

PHP:
$reqPayloadString = <<<XML
        <ns1:echo xmlns:ns1="http://wso2.org/wsfphp/samples">
                <text>Hello World!</text>
        </ns1:echo>
XML;

    $reqMessage = new WSMessage($reqPayloadString,
        array("to"=>"http://localhost/echo_service_addr.php",
              "action" => "http://wso2.org/wsfphp/samples/echoString"));
 

miha

Новичок
To, я так понимаю что это урл куда подключаться
Action - адрес метода по спецификации, пишется в WS-Adressing

Посмотрите спецификацию WS-Addressing

<wsa:Action wsu:Id="Id-9581df26-4db6-4382-8db9-9cf5c77508bb"></wsa:Action>
<wsa:MessageID wsu:Id="Id-ee10b8f8-9526-4378-a08f-722757c5c223"></wsa:MessageID>
<wsa:RelatesTo wsu:Id="Id-8585290b-2c72-4464-a913-6048714c59d2"></wsa:RelatesTo>
<wsa:To wsu:Id="Id-ded83276-c783-4164-9fae-22e9627f4c0"></wsa:To>
 

DiMoN_TD

Новичок
Спасибо :)

Но все равно чтото не получается мне ответа получить от сервера.
В ответ все время вылазит: Message = Error , NO Response Received

Пытаюсь подрубиться следующим образом:

PHP:
<?
$reqPayloadString = <<<XML
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <FunctionName xmlns="i-OTM">
      <parameter1>int</parameter1>
      <parameter2>int</parameter2>
      <parameter3>string</parameter1>
    </FunctioName>
  </soap:Body>
</soap:Envelope>
XML;



try {
    $my_cert = trim(ws_get_cert_from_file(CERTIFICATES_PATH."/certif.cer"));

/*Почему-то функция выше приплетает сертификату лишнее значение " -", хз почему. Вот я и рублю данной функцией*/       
    $my_cert = substr($my_cert,0,strlen($my_cert)-2);
    
    $reqMessage = new WSMessage($reqPayloadString,
                                array(	"to"		=>	"https://url/",
                                		));
    
    $security_options = array("useUsernameToken" => TRUE );
    
    $policy = new WSPolicy(array("security" => $security_options));
    
    $security_token = new WSSecurityToken(array("user" 			=>	base64_encode("$login"),
                                                "password" 		=>	utf8_encode($pass),
                                                "passwordType" 	=>	"Digest",
                                                "certificate"	=>	$my_cert));
    
    $client = new WSClient(array(
                                	"policy" => $policy,
                                	"securityToken" => $security_token));
				
    $resMessage = $client->request($reqMessage);
    
    printf("Response = %s \n", $resMessage->str);

} catch (Exception $e) {

	if ($e instanceof WSFault) {
		printf("Soap Fault: %s\n", $e->Reason);
	} else {
		printf("Message = %s\n",$e->getMessage());
	}

}
?>
В итоге приходит: Message = Error , NO Response Received.
Может быть у кого есть какие идеи? Заранее спасибо
 

Alexandre

PHPПенсионер
не что не дается с такой щедростью как советы....
ни работал с этими либами, по этому только идея
1) посмотри что формирует твой скрипт, меня интересует XML
2) сравни со спецификацией http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0.pdf
3) могу посоветовать попросить спецификацию у Поставщика услуг,
4) могу посоветовать прочитать статью http://www.samag.ru/cgi-bin/go.pl?q=content;n=2007;a=04 там рассказано как все сделать используя php+утилиту командной строки xmlsec
5) попытаться что-то сделать сперва в автономе, каждый кто писал библиотеку из всех имеющихся - писали под свои конкретные нужды и они могли отличаться от стандартных поставщиков услуг...
я имею ввиду сформировать требуемый XML и отправить его поставщику услуг.

слыйды с Конференции http://edocs.phpclub.net/xmlsec.ppt
найдешь кое что полезное, но мало :)

что касается моего прогресса, soapClient частично реализован для спецификации Аутентификация, к серверу не приступал
шифрование (WsEncryption) - второй этам
как только будет альфа - выложу патч, может быть соап клиента закончу через месяц.
я так понимаю в основном всем нужен клиент.

miha ты обещал мне помочь с тестированием... в смысле, можно оттестировать на твоем сервисе? или хотябы есть возможность мне предоставить "эхо сервис"?

спасибо за понимание
 

miha

Новичок
Запросто, вот адрес тестового сервиса http://portal.crog.ru/Spo.asmx

Тебе надо от меня получить сертификат только, напиши мне - я скажу как его получить.
 

Alexandre

PHPПенсионер
Михаил, договорились
ближе к окончанию реализации напишу
адрес почты есть
 

DiMoN_TD

Новичок
Автор оригинала: Alexandre
Михаил, договорились
ближе к окончанию реализации напишу
адрес почты есть
Итак, Александр. У вас уже есть окончательная версия вашей разработки по авторизации по WSE на php?
 

Alexandre

PHPПенсионер
У вас уже есть окончательная версия вашей разработки по авторизации по WSE на php?
окончательной нет,
есть написанный патч для SOAP расширения. Реализация только SOAP - клиента.
надо ее отладить, Михаил дал интерфейс, но руки не доходят отладить реализацию.
В разгар кризиса остался без работы, только устроился на новое место, разбираюсь с километрами говнокода...
Раньше Нового года ничего не будет :)
 
Сверху