在使用Apache Santuario时,我能够对XML签名进行签名和验证,但现在我只想将签名应用于属性authenticate="true"的字段。
例如:
<Document>
<DoNotSign></DoNotSign>
<DoSign authenticate="true"></DoSign>
<Something>
<SomethingElse authenticate="true"></SomethingElse>
</Someting>
</Document>有人能帮我理解如何实现这个目标吗?
我添加的引用URI如下:
xmlSignature.addDocument("#xpointer(//*[@authenticate='true'])", transforms, Constants.ALGO_ID_DIGEST_SHA1);得到一个例外:
Original Exception was org.apache.xml.security.utils.resolver.ResourceResolverException:
Could not find a resolver for URI #xpointer(//*[@authenticate='true'])我试着添加以下内容:
transforms.addTransform(Transforms.TRANSFORM_XPOINTER);
xmlSignature.getSignedInfo().addResourceResolver(new ResolverXPointer());这将在添加XPOINTER转换时返回一个异常。ResolverXPointer似乎没有任何效果。
TransformationException: Unknown transformation.
No handler installed for URI http://www.w3.org/TR/2001/WD-xptr-20010108完整的方法如下:
final var transforms = new Transforms(document);
transforms.addTransform(Transforms.TRANSFORM_ENVELOPED_SIGNATURE);
transforms.addTransform(Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS);
transforms.addTransform(Transforms.TRANSFORM_XPOINTER);
xmlSignature.addDocument("#xpointer(//*[@authenticate='true'])", transforms, Constants.ALGO_ID_DIGEST_SHA1);
xmlSignature.addKeyInfo(signingCertificate);
xmlSignature.sign(signingKey);发布于 2021-08-17 15:12:15
为了解决这个问题,我创建了一个自定义ResourceResolverSPI并添加了它
ResourceResolver.register(new XPathResourceResolver(), true);这解决了这个问题,自定义解析器只使用XPath来创建用于签名的集合。
https://stackoverflow.com/questions/68717782
复制相似问题