Я нашел очень интересным ответ на вопрос о том, как реализовать ws-security 1.1 в php5, но мне нужно использовать сертификаты для аутентификации подключения к WebService.
Кто-нибудь знает, как это сделать на PHP5?
Спасибо заранее!
Вот мой сценарий. С помощью этого сценария он возвращает меня:
При проверке безопасности для сообщения произошла ошибка. И я хочу найти способ отладить это сообщение. Файл .pem создается из файла подписанного сертификата и ca-файла. .crt является ca-сертификатом. У меня нет информации о том, чего именно ожидать сервер. Позже я буду проверять владельцев серверов для получения дополнительной информации и может ли они предоставить мне некоторую отладочную информацию
require('wse/soap-wsa.php'); require('wse/soap-wsse.php'); define('PRIVATE_KEY', dirname(__FILE__).'/cert/B_13925_Cert.pem'); define('CERT_FILE', dirname(__FILE__).'/cert/Generali-Root.crt'); class mySoap extends SoapClient { function __doRequest($request, $location, $saction, $version) { $dom = new DOMDocument(); $dom->loadXML($request); $objWSA = new WSASoap($dom); $objWSA->addAction($saction); $objWSA->addTo($location); $objWSA->addMessageID(); $objWSA->addReplyTo(); $dom = $objWSA->getDoc(); $objWSSE = new WSSESoap($dom); /* Sign all headers to include signing the WS-Addressing headers */ $objWSSE->signAllHeaders = TRUE; $objWSSE->addTimestamp(3600); /* create new XMLSec Key using RSA SHA-1 and type is private key */ $objKey = new XMLSecurityKey(XMLSecurityKey::RSA_SHA1, array('type'=>'private')); /* load the private key from file - last arg is bool if key in file (TRUE) or is string (FALSE) */ $objKey->loadKey(PRIVATE_KEY, TRUE); /* Sign the message - also signs appropraite WS-Security items */ $objWSSE->signSoapDoc($objKey); /* Add certificate (BinarySecurityToken) to the message and attach pointer to Signature */ $token = $objWSSE->addBinaryToken(file_get_contents(CERT_FILE)); $objWSSE->attachTokentoSig($token); $request = $objWSSE->saveXML(); $f = fopen('debug.txt','w'); fwrite($f,print_r($request,true)); fclose($f); return parent::__doRequest($request, $location, $saction, $version); } } $soap_url = 'https://test.domain.bg:9443/GPM/GPMPolicyService.svc/gpm?wsdl'; $soap_client = new mySoap($soap_url); $getNomenclaturesRequest = new getNomenclaturesRequest(array(1,2,3,4)); $request = new GetNomenclatures($getNomenclaturesRequest); try { $out = $soap_client->GetNomenclatures($request); var_dump($out);die(); } catch (SoapFault $fault) { // var_dump($fault); } header('Content-type:text/xml'); print_r(file_get_contents('debug.txt'));