我尝试签名xml,但有一些问题。
数字签名总是出现在文件的末尾,我需要将它添加到节点父亲:
X509Certificate cert= (X509Certificate)keyEntry.getCertificate();
KeyInfoFactory kif = fac.getKeyInfoFactory();
List x509Content = new ArrayList();
x509Content.add(cert.getSubjectX500Principal().getName());
x509Content.add(cert);
X509Data xd = kif.newX509Data(x509Content);
KeyInfo Ki = kif.newKeyInfo(Collections.singletonList(xd));
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
Document doc;
doc = dbf.newDocumentBuilder().parse(new FileInputStream("E:\\HFACHO\\JAVA\\Netbean\\filejavaws.xml"));
DOMSignContext dsc = new DOMSignContext(keyEntry.getPrivateKey(),doc.getDocumentElement());
// ad namespace
dsc.setDefaultNamespacePrefix("ds");
XMLSignature signature = fac.newXMLSignature(si, Ki);
signature.sign(dsc);
//create output file
OutputStream os = new FileOutputStream("E:\\HFACHO\\JAVA\\Netbean\\filejavaws_Firmado.xml");
TransformerFactory tf= TransformerFactory.newInstance();
javax.xml.transform.Transformer trans = tf.newTransformer();
trans.transform(new DOMSource(doc), new StreamResult(os));
答案 0 :(得分:0)
我的方法可能不是很传统,但是从结果中获取签名节点并在顶部创建一个带有签名节点的新xml
根据您的评论更新:
您必须决定是否要将签名保留在其生成和预期的位置,或者如果您想要保留在文档的开头。
如果您还要负责验证海关流程签名的代码,那么后一种方法可行。
答案 1 :(得分:0)
解决方案很简单:
dsc.setParent();