2014-09-03 204 views
1

我想用PHP和xmlseclibs签署XML文件。 但是所有的验证工具都说我的签名是无效的。 XMLSpy的说: “算的摘要值不匹配的参考摘要”XML签名DigestValue无效

这是我的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= 

我如何获得这个消化?

+0

摘要值可能不仅仅取决于blob签名,而且还取决于引用在xml签名中签名的转换。如果您可以共享您的签名文件,这将有所帮助。请注意,当您使用相同的规范化(C14N)对此Blob进行签名时,我会得到与您相同的哈希值。 – Moez 2014-09-03 14:52:29

回答

0

XMLSpy在签名之前对XML进行格式化。它添加了换行符和制表符,而C14N不会删除这些。当您删除<Signature>你留下了这个XML是用来计算消化:

<root> 
    <value>x</value> 

</root> 

另一件事XMLSpy的确实是,它增加了属性URI =“”来<Reference>。 PHP库xmlseclibs默认不会这样做。所以我将我的代码更改为:

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