XML签名DigestValue无效

时间:2014-09-03 10:18:40

标签: php xml xml-signature xmlspy xmlseclibs

我正在尝试使用PHP和xmlseclibs签署XML文件。 但是,所有验证工具都说我的签名无效。 XMLSpy说:"计算的摘要值与参考摘要不匹配"

这是我的XML:

<root><value>x</value></root>

这是我得到的摘要:

KaMTM32K5rXl9U6MgG2BXuzNxoQ=

我过去常常得到的方法:

1。)PHP:

$doc = new DOMDocument();
$doc->loadXML('<root><value>x</value></root>');
echo base64_encode(sha1($doc->documentElement->C14N(), true));

2。)OpenSSL:

openssl dgst -binary -sha1 test.xml | openssl enc -base64

3。)本网站:http://hash.online-convert.com/sha1-generator

这是XMLSpy以某种方式得到的摘要,并且有效:

HedaN7TMgHgq2bRypzavMuFLoCg=

我如何获得此摘要?

1 个答案:

答案 0 :(得分:0)

XMLSpy在签名之前对XML进行格式化。它添加换行符和标签,C14N不会删除这些。当你删除<Signature>时,你会留下这个用于计算摘要的XML:

<root>
    <value>x</value>

</root>

XMLSpy做的另一件事是它添加了属性URI =&#34;&#34;到<Reference>。 PHP库xmlseclibs默认不这样做。所以我把我的代码更改为:

$objDSig->addReference($doc, XMLSecurityDSig::SHA1, array('http://www.w3.org/2000/09/xmldsig#enveloped-signature'), array('force_uri' => TRUE));