【问题标题】:XML Signature Reference digest uses parent namespaceXML 签名参考摘要使用父命名空间
【发布时间】:2015-01-26 02:53:48
【问题描述】:

我需要用 Java 签署一个 XML 文件,该文件需要包含 3 个References。
其中 2 个有效(预期摘要 == 实际摘要),一个无效。
XML 的相关部分如下所示:

<QualifyingProperties xmlns="http://uri.etsi.org/01903/v1.3.2#" Target="Signature1">
    <SignedProperties Id="SignedProperties_1">
        <SignedSignatureProperties>
            <SigningTime>2014-11-27T13:49:36</SigningTime>
        </SignedSignatureProperties>
    </SignedProperties>
</QualifyingProperties>

Reference 仅引用 Element“SignedProperties”及其子项。
如您所见,“QualifyingProperties”Element 定义了一个命名空间(xmlns="http://uri.etsi.org/01903/v1.3.2#"),我想这就是问题所在:

查看我发现的日志后,“Pre-Digest”值如下所示:

<SignedProperties xmlns="http://uri.etsi.org/01903/v1.3.2#" Id="SignedProperties_1">
    <SignedSignatureProperties>
        <SigningTime>2014-11-27T13:49:36</SigningTime>
    </SignedSignatureProperties>
</SignedProperties>

虽然真实文件中的“SignedProperties”Element 不包含命名空间,但其父级包含。
我发现,实际摘要与“Pre-Digest”值的 SHA-256 匹配,而预期摘要与实际文件的 SHA-256 匹配(没有命名空间)。

Reference 使用以下代码创建:

Reference sigPropRef = fac.newReference("#SignedProperties_1", fac.newDigestMethod(DigestMethod.SHA256, null),
    Collections.singletonList(sigPropTransform), "http://uri.etsi.org/01903#SignedProperties", "reference-signedpropeties"
);

其中sigPropTransformCanonicalizationMethod.EXCLUSIVE Transform

我的问题是,我该如何解决这个问题,即如何在计算摘要之前防止将命名空间添加到“SignedProperties”Element

如果您需要任何其他信息,请发表评论,我对这个主题很陌生,所以我不确定哪些信息是相关的,哪些不是。
非常感谢!

编辑: 在我看来,“实际摘要”是验证器计算的摘要,而“预期摘要”是“DigestValue”中的摘要" Element.
这意味着,我文件中的摘要值与引用文件部分的 SHA-256 匹配,但验证器出于某种原因计算带有父名称空间的摘要。
所以我想我需要在我的摘要计算中包含父母命名空间。

编辑:我继续玩 arround,现在我不仅拥有验证器的 Pre-Digest 值,而且还有我的“摘要计算”之一。
那个给我:

<SignedProperties Id="SignedProperties_1"><SignedSignatureProperties><SigningTime>2014-11-27T15:51:26</SigningTime></SignedSignatureProperties></SignedProperties>  

当我给它以下Transform

Transform sigPropTransform = fac.newTransform(CanonicalizationMethod.EXCLUSIVE, (ExcC14NParameterSpec)null);  

还有:

<SignedProperties xmlns:ds="some-url" xmlns:msg="some-other-url" Id="SignedProperties_1"><SignedSignatureProperties><SigningTime>2014-11-27T15:52:49</SigningTime></SignedSignatureProperties></SignedProperties>

当我不给它任何Transform
命名空间 xmlns="http://uri.etsi.org/01903/v1.3.2#" 从未包含在内。

如何包含它?

【问题讨论】:

    标签: java xml digital-signature xml-namespaces sha256


    【解决方案1】:

    恐怕您无法阻止添加命名空间 - 它是在规范化期间添加的。 This 在我遇到相同问题时帮助了我;)

    【讨论】:

    • 您好,感谢您的回复。你已经读过我的“编辑”了吗?我已经发现,命名空间是在规范化过程中自动添加的,所以现在看来​​我需要将它添加到我的摘要计算中。父命名空间是一个“无前缀”命名空间。我如何告诉规范化,它应该使用它来计算摘要?
    • “计算摘要”以创建 sinature 或验证签名?因为如果你自己做签名,你可以从例如计算摘要 与验证器执行此操作的方式完全相同
    • 我自己没有这样做,我正在使用Reference。我需要给它正确的Transforms,以便它包含“no-name”命名空间。如果我不给它任何Transforms,它包括在整个文档中定义的所有命名空间,除了没有前缀的命名空间(它应该包括的命名空间)。如果我使用 Exclusive Cannonicalization 它不包含任何命名空间。我会更新问题!
    • 找到了解决方案(见我的回答)。问题是,命名空间没有注册为命名空间,而只是作为常规属性。感谢您为我指明正确的方向。 +1
    【解决方案2】:

    经过几次尝试,我终于找到了实际问题以及解决方案:
    正如我在问题中已经说过的,摘要计算没有使用父命名空间,定义为xmlns="http://uri.etsi.org/01903/v1.3.2#"
    这是因为我从未将它“注册”为命名空间,但我只是将它添加为普通的Attribute。 要“注册”命名空间,我需要调用 setAttributeNS 而不是 setAttribute
    然后代码看起来像:

    Element eQualifyingProperties= doc.createElement("QualifyingProperties");
    eQualifyingProperties.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns", "http://uri.etsi.org/01903/v1.3.2#");   
    

    第一个参数是 Attribute 的命名空间 uri,因为 Attribute 是命名空间,所以它是 XML 命名空间的 URI。
    第二个参数是属性名,因为它不应该有任何前缀,它只是“xmlns”。
    第三个参数是实际的属性值,即我要“注册”的命名空间uri。
    Element eQualifyingProperties 是“SignedProperties”Element 的父级。

    将命名空间注册为真正的命名空间(不是作为属性)后,定义的Transform

    Transform sigPropTransform = fac.newTransform(CanonicalizationMethod.EXCLUSIVE, (ExcC14NParameterSpec)null);  
    

    将其包含在摘要计算中。

    我在 SO 上的this answer 中找到了这个解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-22
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-26
      • 1970-01-01
      相关资源
      最近更新 更多