java中的数字签名

时间:2015-06-05 18:16:25

标签: java xml digital-signature

我尝试签名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)); 

2 个答案:

答案 0 :(得分:0)

我的方法可能不是很传统,但是从结果中获取签名节点并在顶部创建一个带有签名节点的新xml

根据您的评论更新:

您必须决定是否要将签名保留在其生成和预期的位置,或者如果您想要保留在文档的开头。

如果您还要负责验证海关流程签名的代码,那么后一种方法可行。

http://www.w3.org/TR/xmldsig-core/#sec-o-Simple

答案 1 :(得分:0)

解决方案很简单:

dsc.setParent();