2010-01-27 69 views
3

我一直在試圖找到一些關於如何爲XML簽名(WSDL)生成DigestValue和SignatureValue的示例。如何使用PHP/linux工具生成封裝XML簽名的DigestValue和SignatureValue

下面是用於所述應用的樣品SOAP:

<?xml version="1.0" encoding="UTF-8"?> 
<soapenv:Envelope xmlns:SOAP-SEC="http://schemas.xmlsoap.org/soap/security/2000-12" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<soapenv:Header> 
<SOAP-SEC:Signature soapenv:actor="" soapenv:mustUnderstand="0"> 
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> 
<ds:SignedInfo> 
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> 
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> 
<ds:Reference URI="#Body"> 
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
<ds:DigestValue></ds:DigestValue> 
</ds:Reference> 
</ds:SignedInfo> 
<ds:SignatureValue></ds:SignatureValue> 
</ds:Signature> 
</SOAP-SEC:Signature> 
</soapenv:Header> 
<soapenv:Body Id="Body"> 
<SomeApplicationMethod soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
<Application href="#id0"/></SomeApplicationMethod> 
<multiRef id="id0" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="urn:NCDServices" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns1:SomeApplicationMethod"> 
<param2 xsi:type="soapenc:string">123456</param2> 
<param3 xsi:type="soapenc:string">someString</param3> 
<param4 xsi:type="soapenc:string">string123 bla bla</param4> 
<param5 xsi:type="soapenc:string">0</param5> 
</multiRef> 
</soapenv:Body> 
</soapenv:Envelope> 

我具有從應用程序提供者的單個例子,我似乎無法產生相同的DigestValue和的SignatureValue作爲樣品。根據應用程序文檔,我需要從整個Body部分創建digestValue。

我知道我必須cannonicalize,sha1,然後base64encode。但是,我如何使身體部分變得無法形容? (sha1和base64編碼很容易理解)。

起初我想嘗試創建一個字符串VAR:

$whole_body = '<soapenv:Body Id="Body"> ........stuff inside...... </soapenv:Body>'; 

但後來我發現,有沒有這樣的事情在PHP(至少不會串像var和PHP 5.2和C14N功能下面;不用擔心,我有5.2.6)。

我看着xmlseclibs.php代碼,它似乎使用DOMelement對象來獲取C14N函數。我不是很熟悉DOMelement是什麼..

我嘗試使用xmlseclibs.php簽署我的XML,但似乎沒有工作,我從應用程序中得到'簽名無效'錯誤。

有人可以幫助啓發新手(讀,我:))?

非常感謝您的合作。

回答

1
<?php 

$dom = new DOMDocument(); 
$dom->loadXML($yourXML); // the XML you specified above. 

$canonicalized = $dom->C14N(); // for the whole document 

// .. or: 
$tag = $dom->getElementById("yourID"); // give it an ID, or use getElementsByTagName with ->item(0) or something 
$canonicalized = $tag->C14N(); 

// $canonicalized is the canonicalized form of the XML 
// So, The DigestValue is just: 
$digest = base64_encode(pack("H*", sha1($canonicalized))); 
?> 

這應該做你的伎倆。

我也忙於XML-DSIG,並琢磨着要規範化什麼作品,因爲我收到的文檔質量很差... :(

1

嗯..其實我設法得到它的工作前一陣子。

我結束了由羅布·理查茲使用xmlseclibs。http://code.google.com/p/xmlseclibs/

我建議你試試這個庫,這是非常容易使用。

+0

你能請張貼代碼來獲取身體和簽字嗎?謝謝 – user447951 2012-07-12 21:48:24

+0

@ user447951,你可以克et http://code.google.com/p/xmlseclibs/中的代碼 – mohdyusuf 2012-08-01 17:11:57

相關問題