【发布时间】: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"
);
其中sigPropTransform 是CanonicalizationMethod.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