2014-09-03 203 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));