Java XML签名引用摘要使用父命名空间
我需要用Java签署一个XML文件,该文件需要包含3个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
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”命名空间。我如何告诉规范化,它应该使用它来计算摘要?“计算摘要”来创建圣经,或者验证签名?因为如果你自己做签名,你可以用与验证器完全相同的方式计算摘要。我不是自己做的,我使用的是参考
。我需要给它一个rigthTransform
s,这样它就包含了“no name”名称空间。如果我没有给它任何Transform
s,那么它包含了整个文档中定义的所有名称空间,除了没有praefix的名称空间(它应该包含的名称空间)。如果我使用Exclusive cannonicialization
,它不包括任何名称空间。我会更新问题!找到了解决方案(见我的答案)。问题是,名称空间未注册为名称空间,而仅注册为常规属性。谢谢你给我指出正确的方向+1.
Transform sigPropTransform = fac.newTransform(CanonicalizationMethod.EXCLUSIVE, (ExcC14NParameterSpec)null);