我想在php中实现的soap服务器上验证soap请求的签名。
服务器代码:
$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。没有关于如何实现服务器的示例......
如何加载公钥以检查签名?
[编辑] 我现在可以使用
加载提供的密钥了 $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始终为false。我不知道是不是因为密钥加载错误或实际上无效。我几乎找不到有关使用PHP实现SOAP服务器的信息,也没有关于实现依赖于检查已签名请求的SOAP服务器的信息。
澄清
我的客户端与远程Web服务进行通信并获得确认。
然后远程服务器需要一些时间来处理我的请求。
远程客户端(我无法控制)然后发出请求 我的服务。
最后一步是我无法验证签名
答案 0 :(得分:0)
好吧无论如何,你的第一种方法看起来很好,我的服务器具有相同的结构。不幸的是,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);
}
?>