使用smlseclib返回无效数据的XML签名:数据和摘要不匹配

时间:2012-09-25 10:02:02

标签: php xml soap-client signature xmlseclibs

我正在尝试提交已签名的XML文档(使用xmlseclibs),但签名本身就是错误的。

我正在使用的代码如下:

// input variables:
$tout         = __DIR__ . "/" . $firmacert2;
$certBuffer   = file_get_contents($tout);
$certTempFile = __DIR__ . '/temp/temp.xml';
$xmlBuffer    = base64_decode($xmlstrBase64);

// document creation and loading
$doc = new DOMDocument();
$doc->loadXML($xmlBuffer);
$objDSig = new XMLSecurityDSig();
$objDSig->setCanonicalMethod(XMLSecurityDSig::EXC_C14N);
$objDSig->addReference($doc, XMLSecurityDSig::SHA1, array('http://www.w3.org/2000/09/xmldsig#enveloped-signature'));
$objKey = new XMLSecurityKey(XMLSecurityKey::RSA_SHA1, array('type' => 'private'));

// load private key
$objKey->passphrase = $pass;
$objKey->loadKey($tout, TRUE);

$objDSig->sign($objKey);
// Add associated public key
$objDSig->add509Cert($certBuffer);
$objDSig->appendSignature($doc->documentElement);
$doc->save($certTempFile);
$codif      = file_get_contents($certTempFile);
$xml_base64 = base64_encode($codif);

$param1     = new SoapParam($xml_base64, 'xml');
$com        = new SoapClient('https://www.aespd.es:443/agenciapd/axis/SolicitudService?wsdl', array('trace' => 1, 'encoding' => 'UTF-8'));
$respuesta2 = $com->probarXml($param1);
$respuesta  = base64_decode($respuesta2);

正在发送xml,这很好,但是当我恢复xml文件并检查签名时:http://www.aleksey.com/xmlsec/xmldsig-verifier.html

我得到的错误是:

  

func=xmlSecOpenSSLEvpDigestVerify:file=digests.c:line=229:obj=sha1:subj=unknown:error=12:invalid data:data and digest do not match

我尝试将证书转换为单独的私钥和公钥,相同的文件,不同的文件,导入和导出等。

流程就是这样:

Java程序将生成的未签名的Base64编码的XML发送到PHP文件,该文件使用SoapClient签名并发送,结果被打印,然后由Java程序捕获和解释,从而避免在计算机上使用此单独的证书系统

0 个答案:

没有答案