我正在尝试验证使用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 specs中查找了这一点,他们说根元素应该始终保留它们的名称空间,除非是空的默认名称空间。消失的名称空间既不是默认的,也不是空的,所以我不确定这是DOMNode::C14N()中的一个bug,还是我忽略了什么重要的东西。
发布于 2014-05-06 01:49:45
c14n规范suggests that extra namespaces don't make it into the canonicalized form。如果你使用了ns2等,他们应该把它写到->c14n发出的文档中。
https://stackoverflow.com/questions/13126581
复制相似问题