В настоящее время я разрабатываю клиент WS, который должен подписывать свои запросы перед отправкой на сервер. У меня есть закрытый ключ и сертификат для этой цели, но я борюсь с заголовком безопасности. Ожидаемая структура выходного XML должна быть примерно такой:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header><wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-
1.0.xsd"><wsse:BinarySecurityToken EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary"ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" wsu:Id="CertId-45..."xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-
1.0.xsd"> ... </wsse:BinarySecurityToken><ds:Signature Id="Signature-13"xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<ds:Reference URI="#id-14">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>62...</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>
...
</ds:SignatureValue>
<ds:KeyInfo Id="KeyId-...">
<wsse:SecurityTokenReference wsu:Id="STRId-..." xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-
wss-wssecurity-utility-1.0.xsd"><wsse:Reference URI="#CertId-..." ValueType="http://docs.oasis-
open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"/></wsse:SecurityTokenReference>
</ds:KeyInfo>
</ds:Signature></wsse:Security></soapenv:Header>
<soapenv:Body wsu:Id="id-14" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
Я пытался использовать xmlseclibs, но я не могу понять, как включить всю необходимую информацию, так как примеры являются довольно простыми.
Я полагаю, я мог бы пойти по пути самоделки и вручную создать заголовки, но я бы хотел сделать его максимально простым.
Есть какие-нибудь подсказки?
В настоящее время я использую SoapClient для этой задачи. Дело в том, что я не знаю, как именно это сделать. XML, который я отправляю, требует подписи его содержимого, и я сделал это вручную (с помощью функции c14n и вычисления ее дайджеста ..). Однако, чтобы сделать то же самое для всего тела, мне нужен доступ к необработанному XML (я полагаю), поэтому я не думаю, что это сработает.
Я не пытался создавать заголовки SOAP вручную, так как я стараюсь избегать любых взломов. Я ищу что-то, что легко реализовать и с которым легко работать.
Мой код в настоящее время выглядит следующим образом (сводя его к минимуму для улучшения читаемости):
$context = stream_context_create(array(
'ssl' => array(
'verify_peer' => false,
'allow_self_signed' => true,
'ciphers'=>'SSLv3'
)
));
$client = new SoapClient($url, array(
//'connection_timeout' => 100,
/* 'passphrase' => $pass,
'local_cert' => $keystore,*/
'stream_context' => $context,
// 'connection_timeout' => 1,
'trace' => true,
'exceptions' => true
));
$soapBody = new \SoapVar($xml, \XSD_ANYXML);
try{
$client->__soapCall('SOMEACTION', array($soapBody));
}
catch (SoapFault $exception) {
echo $exception->getMessage();
}
xml
переменная содержит код XML, который я знаю, является правильным. Он был протестирован как на SoapUI (где я должен был предоставить свои ключи и пароль), так и на сервисе онлайн-тестирования, который предоставил мой провайдер. Это означает, что отправляемые данные на 100% верны.
Тем не менее, мой код PHP заканчивается «Внутренняя ошибка». Я предполагаю, что это связано с отсутствием сертификатов и тому подобного. Я не уверен, есть ли способ получить больше информации из ответа, но нет документации об указанной ошибке.
Я играл с несколькими опциями и хранилищами ключей, закрытыми ключами и сертификатами в нескольких форматах, но не получил никакого положительного результата. Я думаю, что все это связано с тем, что правильный заголовок не отправляется.
Большое спасибо.
Задача ещё не решена.
Других решений пока нет …