如何在php中签署SOAP消息

时间:2016-04-21 15:17:52

标签: php web-services soap digital-signature soap-client

我使用phpyii2),我希望与服务器实现SOAP通信。我有以下SOAP指南:

  

客户的系统使用客户的私钥进行发布   数字签名。两个应用程序请求(ApplicationRequest)   并且必须在WSC中单独签署SOAP消息。该   签名是使用私钥执行的。签名系统必须   在签名中还包括证书。这个证书   包含与在中使用的私钥对应的公钥   签约。接收方使用公钥来验证   签名。

  

下一步:数字签名(分离式XML数字签名)   整个SOAP消息与发件人证书的私钥和put   签名到SOAP-header

所以,我有自己的private.keypublic.keycertificate.cer

我的代码看起来像

    $client = new SoapClient($wdsl, ['trace' => true]);
    $arguments = ['DownloadFileListRequest' => $dflr];
    $appResponse = $client->__call('downloadFileList', $arguments);

但是我得到了预期的错误:

SOAP signature error

我需要做什么以及如何签署此SOAP?

1 个答案:

答案 0 :(得分:0)

XMLSecurityDSig帮助(https://github.com/robrichards/xmlseclibs

$dom = new DOMDocument('1.0', 'UTF-8');
$ar = $dom->createElementNS('http://bxd.fi/xmldata/', 'ApplicationRequest');
$dom->appendChild($ar);
$ar->appendChild($dom->createElement('CustomerId', $this->userID));
...
$ar->appendChild($dom->createElement('Content', $contentBase64));

$objDSig = new XMLSecurityDSig();
$objDSig->setCanonicalMethod(XMLSecurityDSig::EXC_C14N);
$objDSig->addReference(
            $dom,
            XMLSecurityDSig::SHA256,
            ['http://www.w3.org/2000/09/xmldsig#enveloped-signature'],
            ['force_uri' => true]
        );
$objKey = new XMLSecurityKey(XMLSecurityKey::RSA_SHA256, ['type'=>'private']);
$objKey->loadKey($this->privateKeyPath, true);
$objDSig->sign($objKey);
$objDSig->add509Cert(base64_encode(file_get_contents($this->certificatePath)), false);
$objDSig->appendSignature($dom->documentElement);

$xmlRaw = $dom->saveXML();