Проверка подписи в реализации сервера WS *

Я хочу проверить подпись для запроса мыла на сервере мыла, реализованном на php.

Код сервера:

$Server = new SoapServer();

$d = new DOMDocument();
$d->load('php://input');

$s = new WSSESoapServer($d);
try {
    if($s->process()) {
        // Valid signature
        $Server->handle($s->saveXML());
    } else {
        throw new Exception('Invalid signature');
    }
} catch (Exception $e) {
    echo "server exception: " . $e;
}

Ошибка:

exception 'Exception' with message 'Error loading key to handle Signature' in /<path>/wse/src/WSSESoapServer.php:146

Я реализовал клиента для подписи запросов SOAP с помощью этой библиотеки: https://github.com/robrichards/wse-php. Нет примеров, как реализовать сервер ...

Как загрузить открытый ключ для проверки подписи?

[Edit] Теперь я могу загрузить предоставленный ключ, используя

    $key = new XMLSecurityKey(XMLSecurityKey::RSA_SHA1, array('type' => 'public'));
    $key->loadKey(CERT, true);

Я больше не получаю сообщение об ошибке при проверке подписи:

$x = new XMLSecurityDSig();
$d = $x->locateSignature($soapDoc);
$valid = $x->verify($key);

Однако $ valid всегда ложно. Понятия не имею, потому что ключ загружен неправильно или действительно недействителен. Я могу найти очень мало информации о реализации SOAP-сервера с PHP и никакой информации о реализации SOAP-сервера, который полагается на проверку подписанного запроса.

УТОЧНЕНИЕ

  1. Мой клиент обращается к удаленной веб-службе и получает подтверждение.

  2. Затем удаленному серверу требуется некоторое время для обработки моего запроса.

  3. Затем удаленный клиент (которого я не могу контролировать) делает запрос в мою службу.

На последнем этапе у меня возникают проблемы с проверкой подписи.


person soulfreshner    schedule 22.10.2015    source источник
comment
Мне кажется, что WSSESoapServer автоматически обнаруживает и проверяет подписи в мыльном сообщении. Итак, ваш первый подход должен быть в порядке, вам не нужно вручную загружать ключ или проверять. Но: WSSESoapServer требует, чтобы подписанное мыльное сообщение включало подпись И открытый ключ для проверки подписи.   -  person smat88dd    schedule 02.11.2015
comment
Вас все еще интересует решение или вы можете исправить это самостоятельно? Я установил тестовый клиент и сервер и могу опубликовать его в качестве ответа !? В любом случае, я мог бы запустить его, сервер wsse проверяет подписи без ошибок.   -  person smat88dd    schedule 03.11.2015
comment
@ smat88dd Я думаю, что моя последняя правка исправила это, загрузив подпись. Я не могу контролировать клиента, который делает запрос. Я думаю, что открытый ключ, который у меня есть, может быть недействительным, потому что он всегда оценивается как ложный. Если ваше решение отличается от моего, мне все равно хотелось бы его увидеть. Хоть бы иметь некоторую документацию, к которой можно было бы обратиться.   -  person soulfreshner    schedule 03.11.2015
comment
у вас нет контроля над клиентом? но в своем первоначальном сообщении вы сказали, что создали клиент с библиотекой из github.com/robrichards/wse- php, и эта библиотека и включенные примеры подписывают мыльное сообщение и включают публичную подпись. какой другой клиент вы сейчас используете?   -  person smat88dd    schedule 04.11.2015
comment
@ smat88dd извини. Чтобы уточнить: у меня есть клиент, который делает запрос к веб-службе. Эта часть работает нормально. Обработка запроса занимает некоторое время. Затем клиент на другом конце делает запрос к моей веб-службе. У меня нет контроля над удаленным клиентом, но мне нужно создать сервер для обработки запроса, и я не уверен, правильно ли я реализовал сервер.   -  person soulfreshner    schedule 04.11.2015


Ответы (1)


В любом случае, ваш первый подход мне подходит, мой сервер имеет такую ​​же структуру. К сожалению, WSSESoapServer не наследуется от SoapServer, поэтому на самом деле это не SoapServer, а скорее SoapSignatureValidator, и его следует называть так. Это поведение можно было бы легко исправить, чтобы не потребовался отдельный SoapServer экземпляр (должен быть прозрачным и автоматически).

<?php
require 'soap-server-wsse.php';

try {
    // get soap message
    $xmlSoap = DOMDocument::load('php://input');

    // validate signature
    $validateSignature = new WSSESoapServer($xmlSoap);
    if(!$validateSignature->process())
        file_put_contents("log.txt", "soapserver: SIGNATURE VALIDATION ERROR - CONTINUING WITHOUT SIGNATURE\n", FILE_APPEND);
        //throw new Exception('Invalid Signature'); # this would cancel the execution and not send an answer

    $sServer = new SoapServer($wsdl);
    // actually process the soap message and create & send answer
    //$sServer->setClass() or setObject() or set setFunction()
    $sServer->handle($validateSignature->saveXML());
} catch (Exception $fault) {
    file_put_contents("log.txt", "soapserver soapfault: ".print_r($fault, true), FILE_APPEND);
}
?>
person smat88dd    schedule 04.11.2015
comment
Да, кстати, этот код действительно работает, но только тогда, когда открытый ключ подписи включен в мыльное сообщение. Если кто-то хочет предоставить открытый ключ самостоятельно, необходимо внести изменения в WSSESoapServer. - person smat88dd; 04.11.2015
comment
..но это вообще не отвечает на вопрос. Вся моя проблема заключается в загрузке открытого ключа для проверки подписи. Какие изменения нужны? Тем не менее, спасибо за помощь. По крайней мере, я вижу, что на правильном пути - person soulfreshner; 04.11.2015
comment
Прошу прощения, позвольте мне уточнить: WSSESoapServer не имеет возможности загрузить открытый ключ. Это сделано для того, чтобы получить ключ из мыльного сообщения. Мой ответ был частичным, потому что вы также спрашивали, как сделать сервер с WSSESoapServer, потому что примеров не было. - person smat88dd; 05.11.2015
comment
Ах хорошо. Спасибо за это :) - person soulfreshner; 05.11.2015
comment
На самом деле, я ответил на ваш вопрос в своем ответе. Когда вы внимательно прочитали, я сказал, что вам придется изменить класс WSSESoapServer, чтобы разрешить загрузку предоставленных пользователем открытых ключей. - person smat88dd; 05.11.2015