Xml Java 中的签名,但仅限于属性 authenticate='true' 的元素

Xml Signature in Java but only on elements where attribute authenticate='true'

我已经能够在使用 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());

这 returns 我在添加 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);

为了解决这个问题,我创建了一个自定义 ResourceResolverSPI 并添加了它

  ResourceResolver.register(new XPathResourceResolver(), true);

问题已解决,自定义解析器仅使用 XPath 创建用于签名的集合。