В момента разработвам 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 код обаче завършва с „Вътрешна грешка“. Предполагам, че е свързано с липсата на сертификати и други подобни. Не съм сигурен дали има начин да получа повече информация от отговора, но няма документация за споменатата грешка.
Играх си с няколко опции и хранилища за ключове, частни ключове и сертификати в няколко формата, без да получа положителен резултат. Мисля, че всичко е свързано с факта, че не се изпраща правилният хедър.
Благодаря много.
Uncaught SoapFault exception
: [env:Client] вътрешна грешка в ...`. Наистина не разбирам въпроса ви, искате ли да кажете, че искате връзка към xsd? - person wtf8_decode   schedule 22.12.2014htmlspecialchars()
или кажете на браузъра си, че изходът е текст, като зададете съответно заглавката тип съдържание (което от двете е по-лесно за вас , вижте също: Как да покажа XML в HTML в PHP?) - person hakre   schedule 22.12.2014php script.php
. Благодаря за линка, ще го погледна. Част от публикуваната информация изглежда много обещаваща. Сега, когато го прочетох по-подробно, мисля, че проблемът на OP е доста различен. Неговият проблем е, че не може да накара SoapClient да използва определен WSDL URL адрес и трябва да разреши това. Проблемът ми е, че не мога да използвам определена услуга, без да предам подходящата заглавка. В момента не се изпращат заглавки. Ще се опитам да видя дали мога да разширя класа SoapClient и ръчно да задам някои заглавки, но дори и да проработи, не е това, което преследвам. - person wtf8_decode   schedule 22.12.2014header
е вътре в HTTP опции. За SOAP заглавки, които са различни, вижте въпроса, свързан с заглавката на WS-Security зададох по-рано. - person hakre   schedule 22.12.2014