0

我正在尝试使用带有 javax.xml.crypto.dsig.* 包的 XMLDSig 签署一些文本。我需要参考一些正在签名的内容。并且根据项目要求,这个引用不应该有任何URI,它的意思不是<Reference URI="">...</Reference>,而是<Reference>...</Reference>。

我还没有找到任何信息是否可能和正确,但要求说 XMLDSig 允许这样的引用,每个签名最多一个。

有人遇到过同样的问题吗?可以做些什么来使用 javax.xml.crypto.dsig.* 包生成具有此类引用的签名并且没有魔法?

据我了解,上面提到的包只允许使用 URI(或空 URI)引用一些数据,但根本不能没有任何 URI。可能是我在使用过程中遗漏了一些东西?

4

2 回答 2

0

事实上,XML 签名可以包含一个Reference没有 URI 的签名,但是您需要告诉签名上下文如何找到以这种方式引用的对象。这可以通过使用自定义实现来完成URIDereferencer

因此,要在没有任何 URI 的情况下引用签名中的某些内容,您可以执行以下操作:

Reference dataReference = xmlSigFactory.newReference(null, <your digest method>, <your transformations list>, <needed type>, <id>);

其中第一个null参数表示nullURI,即没有 URI。

要使此引用有效,您需要在对象中指定您的自定义URIDereferencer实现,该DOMSignContext对象包含对正在签名的内容的所有引用。此自定义URIDereferencer应包含查找正在签名的内容的逻辑,它是您自己的实现,因此您应该知道如何查找所需的内容。

于 2013-08-30T06:12:28.417 回答
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();
        }
    };
}
}
于 2020-02-07T02:25:48.407 回答