2012-10-29 73 views
1

我想驗證使用XMLDSig簽名的XML消息。爲了創建消息摘要,我需要首先對消息進行規範化。它工作正常,除了的DOMNode :: C14N()從下面的代碼刪除第二個命名空間:PHP DOMNode :: C14N()省略了根元素的第二個名稱

<?xml version="1.0" encoding="UTF-8"?><DirectoryRes xmlns="http://www.idealdesk.com/ideal/messages/mer-acq/3.3.1" xmlns:ns2="http://www.w3.org/2000/09/xmldsig#" version="3.3.1"> 
    <createDateTimestamp>2012-10-29T17:04:56.374Z</createDateTimestamp> 
    <Acquirer> 
     <acquirerID>0050</acquirerID> 
    </Acquirer> 
    <Directory> 
     <directoryDateTimestamp>2012-10-29T17:04:56.374Z</directoryDateTimestamp> 
     <Country> 
      <countryNames>Deutschland</countryNames> 
      <Issuer> 
       <issuerID>NLINGB2U152</issuerID> 
       <issuerName>Issuer Simulator</issuerName> 
      </Issuer> 
     </Country> 
    </Directory> 
</DirectoryRes> 

上面進行規範化在以下XML結果XML:

<DirectoryRes xmlns="http://www.idealdesk.com/ideal/messages/mer-acq/3.3.1" version="3.3.1"> 
    <createDateTimestamp>2012-10-29T17:04:56.374Z</createDateTimestamp> 
    <Acquirer> 
     <acquirerID>0050</acquirerID> 
    </Acquirer> 
    <Directory> 
     <directoryDateTimestamp>2012-10-29T17:04:56.374Z</directoryDateTimestamp> 
     <Country> 
      <countryNames>Deutschland</countryNames> 
      <Issuer> 
       <issuerID>NLINGB2U152</issuerID> 
       <issuerName>Issuer Simulator</issuerName> 
      </Issuer> 
     </Country> 
    </Directory> 
</DirectoryRes> 

遠程服務器我在計算消息摘要時使用此名稱空間進行測試,因此驗證顯然失敗。我在創建自己的摘要之前首先添加了名稱空間,以便與消息中嵌入的摘要(簽名在發佈之前從上面的XML代碼中剝離)進行比較,從而證實了此問題。然而,代碼必須與不同的服務器一起工作,其中一些服務器可能會或可能不會添加命名空間(它們不是規範的一部分,但據我所知只是添加一個冗餘名稱空間聲明不應該受到傷害)。我在W3C XML C14N specs中查了這個,他們說根元素應該總是保留他們的命名空間,除了空的默認命名空間。消失的命名空間既不是默認的也不是空的,所以我不確定這是DOMNode :: C14N()中的錯誤還是我忽略了一些重要的東西。

回答

0

你可能已經想通了這一點,但因爲你與iDEAL進行溝通,你必須遵循自己的「簽名了iDEAL消息」的言論:

爲了生成主要消息摘要的目的,包容規範化算法必須使用。這種主消息規範化的方法並非(總是)在iDEAL XML消息中明確指出。由於這個原因,這個變換沒有被包含在本文檔中的示例消息中。商家不需要在消息中明確指出這種轉換。

來源:https://www.pronamic.eu/wp-content/uploads/sites/2/2016/06/Merchant-Integration-Guide-v3-3-1-ENG-February-2015.pdf

這會引起混亂,因爲CanonicalizationMethod元件算法是http://www.w3.org/2001/10/xml-exc-c14n#。但對於摘要,您始終必須使用https://www.w3.org/TR/2001/REC-xml-c14n-20010315。該規範化方法算法也將保留xmlns:ns2="http://www.w3.org/2000/09/xmldsig#"

xmlseclibs庫中,使用了很多對於理想的,是http://www.w3.org/TR/2001/REC-xml-c14n-20010315規範化方法算法的默認:

https://github.com/simplesamlphp/xmlseclibs/blob/v1.3.2/xmlseclibs.php#L872