php - 检查WS *服务器实现中的签名

标签 php web-services soap wsse

我想在用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总是错误的。我不知道是因为密钥加载错误还是实际上无效。我几乎找不到关于用php实现soap服务器的信息,也找不到关于实现依赖于检查签名请求的soap服务器的信息。
澄清
我的客户与一个远程web服务对话并得到确认。
然后远程服务器需要一些时间来处理我的请求。
远程客户端(我无法控制)然后向
我的服务。
最后一步是在验证签名时遇到问题

最佳答案

好吧,不管怎样,你的第一个方法看起来很好,我的服务器有相同的结构。不幸的是,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);
}
?>

本文翻译自 https://stackoverflow.com/questions/33272115/

网站遵循 CC BY-SA 4.0 协议,转载或引用请注明出处。


相关文章:

php - 如何使用php脚本制作代理?

php - 如何分离PHP生成的按钮

web-services - 使用部署在Tomcat中的CXF插件的Grails应用

xml - 名称空间URI中的斜杠有什么意义?

java - 如何将对象转换为XML文档

php - 如何从mysql表中选择包含至少一个大于搜索值的所有行?

php - 如何阻止Laravel在页面刷新时将数据插入数据库?

java - 将联网的Java桌面应用程序迁移到Web应用程序有哪些选项?

java - PKIX路径构建失败(SSL握手异常)

php - PHP SoapClient:SoapFault异常无法连接到主机