【问题标题】:xades4j: Sign only one elementxades4j:只签署一个元素
【发布时间】:2015-01-22 14:04:50
【问题描述】:

我正在使用此代码签署一个 xml 文档:

Document doc = getDocument(xml_to_sign);
Element elemToSign = doc.getDocumentElement();

String file_uri_path = elemToSign.getBaseURI();

DataObjectDesc obj1 = new DataObjectReference(file_uri_path).withType("http://www.gzs.si/shemas/eslog/racun/1.5#Racun");
SignedDataObjects dataObjs = new SignedDataObjects(obj1);

signer.sign(dataObjs, elemToSign);

xml_to_sign 是 xml 文件的完整路径。

问题是,我只想对 ID 为“data”(#data)的节点进行签名,但将签名附加到节点 elemToSign。

用 xades4j 可以做到这一点吗?

【问题讨论】:

    标签: java xml xades4j


    【解决方案1】:

    是的,是的。 sign method 的参数是父节点,而不是要签名的元素(它可能是同一个节点,取决于配置的引用)。在您的示例中,您应该添加对“#data”的引用:

    Document doc = getDocument(xml_to_sign);
    Element parent = doc.getDocumentElement();
    
    DataObjectDesc obj1 = new DataObjectReference("#data").withType("http://www.gzs.si/shemas/eslog/racun/1.5#Racun");
    SignedDataObjects dataObjs = new SignedDataObjects(obj1);
    
    signer.sign(dataObjs, parent);
    

    另一种选择是为整个 XML 文档(空 URI)添加引用并使用 XPath 转换。

    【讨论】:

    • 我试过这样做,但我得到一个例外:“无法解析带有 ID 数据的元素”,但我有元素
    • 可能需要将该元素的 Id 属性设置为其“XML Id”才能使“getElementById”工作(由 Apache 的解析器在内部使用)。
    【解决方案2】:

    您应该在 xml 文档中指定名为“Id”的属性是 Apache Santuario(Xades4j 内部使用)将在 getElementById() 中使用的 XML ID 属性(正如 lgoncalves 在他自己的评论中指出的那样回答)。

    Element parent = doc.getDocumentElement();
    parent.setIdAttribute("Id", true);
    //or parent.setIdAttributeNS("http://your.name.space", "Id", true);
    

    我遇到了同样的问题,这行额外的代码解决了它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-13
      • 1970-01-01
      • 1970-01-01
      • 2018-03-19
      相关资源
      最近更新 更多