我正在使用此代码签署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执行此操作?
答案 0 :(得分: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转换。
答案 1 :(得分:0)
您应该指定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);
我有同样的问题,这个额外的代码解决了它。