我正在尝试验证使用 XMLDSig 签名的 XML 消息。为了创建消息摘要,我需要先规范化消息。它工作正常,除了 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 规范中查找了这个他们说根元素应该始终保留它们的命名空间,除了空的默认命名空间。消失的命名空间既不是默认的,也不是空的,所以我不确定这是否是 DOMNode::C14N() 中的一个错误,或者我是否忽略了一些重要的东西。