我想驗證使用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()中的錯誤還是我忽略了一些重要的東西。