PHP DOM Node :: C14N()省略了根元素第二个命名空间

时间:2012-10-29 17:21:53

标签: php xml xml-signature canonicalization

我正在尝试验证使用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()中的错误,或者我是否忽略了重要的事情。

2 个答案:

答案 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消息中明确指出。因此,此转换未包含在本文档的示例消息中。商家无需在其消息中明确指出此转换。

来源: 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库中,大量用于iDEAL,默认为http://www.w3.org/TR/2001/REC-xml-c14n-20010315规范化方法算法:

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