1

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

4

2 回答 2

0

c14n 规范建议额外的命名空间不会使其成为规范化形式。如果您使用 ns2 等,它们应该将其放入 ->c14n 发出的文档中。

于 2014-05-05T17:49:45.227 回答
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

于 2016-06-01T19:08:38.037 回答