我正在尝试验证使用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()中的错误,或者我是否忽略了重要的事情。
答案 0 :(得分:0)
c14n规范suggests that extra namespaces don't make it into the canonicalized form。 如果您使用了ns2等,则应将其记录到 - &gt; c14n发出的文档中。
答案 1 :(得分:0)
您可能已经想到了这一点,但由于您正在与iDEAL进行通信,因此您必须遵循其“签署iDEAL消息”备注:
为了生成主消息的摘要,必须使用包含规范化算法 6 。这种主要消息的规范化方法并未(始终)在iDEAL XML消息中明确指出。因此,此转换未包含在本文档的示例消息中。商家无需在其消息中明确指出此转换。
这可能令人困惑,因为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
库中,大量用于iDEAL,默认为http://www.w3.org/TR/2001/REC-xml-c14n-20010315
规范化方法算法:
https://github.com/simplesamlphp/xmlseclibs/blob/v1.3.2/xmlseclibs.php#L872