Archive for the ‘php’ Category
PHP Soap client и WS-Security
Для того, чтобы отправить soap-запрос с цифровой подписью, можно конечно использовать extension WSF и переделывать все свои запросы, основанные на SoapClient.
Но есть и вариант попроще с использованием библиотеки soap-wsse:
require_once('soap-wsse.php');
class SecuredSoapClient extends SoapClient {
public function __doRequest($request, $location, $action, $version, $one_way = 0) {
$doc = new DOMDocument('1.0');
$doc->loadXML($request);
$pem = file_get_contents('client.pem'); // файл с сертификатом и private ключом
$wsse = new WSSESoap($doc);
// добавляем в запрос сертификат
$bin_token = $wsse->addBinaryToken($pem);
// получаем private ключ для подписи
$sec_key = new XMLSecurityKey(XMLSecurityKey::RSA_SHA1, array('type' => 'private'));
$sec_key->loadKey($pem);
// добавляем цифровую подпись в запрос
$wsse->signSoapDoc($sec_key);
// добавляем в цифровую подпись ссылку на сертификат
$wsse->attachTokentoSig($bin_token);
return parent::__doRequest($wsse->saveXML(), $location, $action, $version, $one_way);
}
}
class SecuredSoapClient extends SoapClient {
public function __doRequest($request, $location, $action, $version, $one_way = 0) {
$doc = new DOMDocument('1.0');
$doc->loadXML($request);
$pem = file_get_contents('client.pem'); // файл с сертификатом и private ключом
$wsse = new WSSESoap($doc);
// добавляем в запрос сертификат
$bin_token = $wsse->addBinaryToken($pem);
// получаем private ключ для подписи
$sec_key = new XMLSecurityKey(XMLSecurityKey::RSA_SHA1, array('type' => 'private'));
$sec_key->loadKey($pem);
// добавляем цифровую подпись в запрос
$wsse->signSoapDoc($sec_key);
// добавляем в цифровую подпись ссылку на сертификат
$wsse->attachTokentoSig($bin_token);
return parent::__doRequest($wsse->saveXML(), $location, $action, $version, $one_way);
}
}
Используя класс SecuredSoapClient вместо SoapClient, запросы будут отправляться уже с цифровой подписью.