我正在尝试使用带有javax.xml.crypto.dsig。*包的XMLDSig签署一些文本。我需要引用一些正在签名的内容。根据项目要求,此引用不应包含任何URI,它不是< Reference URI =“”> ...< / Reference>,而是< Reference> ...< / Reference>。
我没有找到任何可能和正确的信息,但要求说XMLDSig允许这样的引用,每个签名最多一个。
有人遇到同样的问题吗?使用javax.xml.crypto.dsig。*包来生成带有这种引用的签名可以做些什么?没有魔法?
据我所知,上面提到的包只允许用URI(或空URI)引用一些数据,但根本没有任何URI。可能是我错过了它的用法吗?
答案 0 :(得分:0)
实际上,XML签名可以包含一个没有URI的Reference
,但是您需要告诉签名上下文如何找到以这种方式引用的对象。这可以通过使用URIDereferencer
的自定义实现来完成。
因此,要在没有任何URI的情况下引用签名中的某些内容,您可以执行以下操作:
Reference dataReference = xmlSigFactory.newReference(null, <your digest method>, <your transformations list>, <needed type>, <id>);
第一个null
参数表示null
为URI,即没有URI。
要使此引用有效,您需要在URIDereferencer
对象中指定自定义DOMSignContext
实现,该实现包含对要签名的内容的所有引用。此自定义URIDereferencer
应包含查找正在签名的内容的逻辑,它是您自己的实现,因此您应该知道如何查找所需内容。
答案 1 :(得分:0)
创建NoUriDereferencer实现URIDereferencer并将其设置为您的XmlSignContect
public class NoUriDereferencer implements URIDereferencer {
private Node data = null;
public NoUriDereferencer(Node node) {
data = node;
}
public Data dereference(URIReference ref, XMLCryptoContext ctxt) {
return new NodeSetData() {
public Iterator iterator() {
return Collections.singletonList(data).iterator();
}
};
}
}