Java XML签名引用摘要使用父命名空间

Java XML签名引用摘要使用父命名空间,java,xml,digital-signature,xml-namespaces,sha256,Java,Xml,Digital Signature,Xml Namespaces,Sha256,我需要用Java签署一个XML文件,该文件需要包含3个References. 其中两个有效(预期摘要==实际摘要),一个无效。 XML的相关部分如下所示: <QualifyingProperties xmlns="http://uri.etsi.org/01903/v1.3.2#" Target="Signature1"> <SignedProperties Id="SignedProperties_1"> <SignedSignatureP

我需要用Java签署一个XML文件,该文件需要包含3个
Reference
s.
其中两个有效(预期摘要==实际摘要),一个无效。
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>
<SignedProperties xmlns="http://uri.etsi.org/01903/v1.3.2#" Id="SignedProperties_1">
    <SignedSignatureProperties>
        <SigningTime>2014-11-27T13:49:36</SigningTime>
    </SignedSignatureProperties>
</SignedProperties>
而实际文件中的“SignedProperties”
元素
不包含名称空间,但其父元素包含名称空间。
我发现,实际摘要与“Pre-digest”值的SHA-256匹配,而预期摘要与实际文件(不带名称空间)的SHA-256匹配

参考
是使用以下代码创建的:

Reference sigPropRef = fac.newReference("#SignedProperties_1", fac.newDigestMethod(DigestMethod.SHA256, null),
    Collections.singletonList(sigPropTransform), "http://uri.etsi.org/01903#SignedProperties", "reference-signedpropeties"
);
其中,
sigPropTransform
是一种
规范化方法。独占的
转换

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

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

编辑:在玩了一点arround之后,在我看来,“实际摘要”是摘要,验证器是经过计算的,而“预期摘要”是“DigestValue”
元素中的摘要
这意味着,我的文件中的摘要值与引用的filepart的SHA-256匹配,但由于某种原因,验证程序使用父命名空间计算摘要。
所以我想我需要的是在摘要计算中包含父命名空间

编辑:我继续玩arround,现在我不仅有验证器的预摘要值,还有我的“摘要计算”值。
这个给了我:

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

<SignedProperties xmlns:ds="some-url" xmlns:msg="some-other-url" Id="SignedProperties_1"><SignedSignatureProperties><SigningTime>2014-11-27T15:52:49</SigningTime></SignedSignatureProperties></SignedProperties>
2014-11-27T15:52:49
当我不给它任何
变换时

名称空间
xmlns=”http://uri.etsi.org/01903/v1.3.2#“
从未包含在内


如何包含它?

恐怕您无法阻止添加名称空间-它是在规范化过程中添加的。
当我遇到同样的问题时,其中一个帮助了我;)

经过几次尝试,我终于找到了实际问题和解决方案:
正如我在问题中所说,摘要计算没有使用父命名空间,定义为
xmlns=”http://uri.etsi.org/01903/v1.3.2#“

这是因为我从未将其“注册”为名称空间,而只是将其添加为普通的
属性。
要“注册”名称空间,我需要调用
setAttributeNS
,而不是
setAttribute

代码如下所示:

Element eQualifyingProperties= doc.createElement("QualifyingProperties");
eQualifyingProperties.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns", "http://uri.etsi.org/01903/v1.3.2#");   
第一个参数是
属性
的名称空间uri,由于
属性
是名称空间,因此它是XML名称空间的uri。
第二个参数是属性名,因为它不应该有任何praefix,它只是“xmlns”。
第三个参数是实际的attibute值,它是我想要“注册”的名称空间uri。
元素eQualifyingProperties
是“SignedProperties”
元素的父元素

将名称空间注册为真实名称空间(而不是属性)后,定义的
转换

Transform sigPropTransform = fac.newTransform(CanonicalizationMethod.EXCLUSIVE, (ExcC14NParameterSpec)null);  
将其包含在摘要计算中


我在上找到了此解决方案。

您好,谢谢您的回复。你准备好读我的“编辑”了吗?我发现,名称空间是在规范化过程中自动添加的,所以现在似乎需要将其添加到摘要计算中。父命名空间是“no praefix”命名空间。我如何告诉规范化,它应该使用它来计算摘要?“计算摘要”来创建圣经,或者验证签名?因为如果你自己做签名,你可以用与验证器完全相同的方式计算摘要。我不是自己做的,我使用的是
参考
。我需要给它一个rigth
Transform
s,这样它就包含了“no name”名称空间。如果我没有给它任何
Transform
s,那么它包含了整个文档中定义的所有名称空间,除了没有praefix的名称空间(它应该包含的名称空间)。如果我使用
Exclusive cannonicialization
,它不包括任何名称空间。我会更新问题!找到了解决方案(见我的答案)。问题是,名称空间未注册为名称空间,而仅注册为常规属性。谢谢你给我指出正确的方向+1.
Transform sigPropTransform = fac.newTransform(CanonicalizationMethod.EXCLUSIVE, (ExcC14NParameterSpec)null);