如何在java中将数字签名封装到xml文件中?
我需要使用java对xml文件进行封装数字签名,目前我可以使用封装数字签名进行签名。谁能帮我做信封签名??我的信封签名代码:如何在java中将数字签名封装到xml文件中?,java,xml,digital-signature,Java,Xml,Digital Signature,我需要使用java对xml文件进行封装数字签名,目前我可以使用封装数字签名进行签名。谁能帮我做信封签名??我的信封签名代码: //code XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM"); Transform exc14nTranform = fac.newTransform("http://www.w3.org/TR/2001/REC-xml-c14n-20010315", (Transfor
//code
XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");
Transform exc14nTranform = fac.newTransform("http://www.w3.org/TR/2001/REC-xml-c14n-20010315", (TransformParameterSpec) null);
Transform envTransform = fac.newTransform(Transform.ENVELOPED, (TransformParameterSpec) null);
List<Transform> transformList = new ArrayList();
transformList.add(exc14nTranform);
transformList.add(envTransform);
Reference ref = fac.newReference("", fac.newDigestMethod(DigestMethod.SHA1, null), transformList,null, null);
SignedInfo si = fac.newSignedInfo(fac.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE,(C14NMethodParameterSpec) null),fac.newSignatureMethod(SignatureMethod.RSA_SHA1, null), Collections.singletonList(ref));
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream("C:\\kstore.jks"), "kspassword".toCharArray());
KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry) ks.getEntry ("aliasname", new KeyStore.PasswordProtection("kspassword".toCharArray()));
X509Certificate cert = (X509Certificate) keyEntry.getCertificate();
KeyInfoFactory kif = fac.getKeyInfoFactory();
List x509Content = new ArrayList();
X509IssuerSerial issuer = kif.newX509IssuerSerial(cert.getIssuerDN().toString(), cert.getSerialNumber());
System.out.println(cert.getSubjectAlternativeNames().toString());
x509Content.add(cert.getSubjectX500Principal().getName());
x509Content.add(issuer);
x509Content.add(cert);
X509Data xd = kif.newX509Data(x509Content);
KeyInfo ki = kif.newKeyInfo(Collections.singletonList(xd));
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
Document doc = dbf.newDocumentBuilder().parse(new FileInputStream("C:\\myfile.xml"));
DOMSignContext dsc = new DOMSignContext(keyEntry.getPrivateKey(), doc.getDocumentElement());
XMLSignature signature = fac.newXMLSignature(si, ki);
signature.sign(dsc);
OutputStream os = new FileOutputStream("C:\\mysignedfile.xml");
TransformerFactory tf = TransformerFactory.newInstance();
Transformer trans = tf.newTransformer();
trans.transform(new DOMSource(doc), new StreamResult(os));
}
}
//代码
XMLSignatureFactory fac=XMLSignatureFactory.getInstance(“DOM”);
变换exc14nTranform=fac.newTransform(“http://www.w3.org/TR/2001/REC-xml-c14n-20010315“,(TransformParameterSpec)null);
Transform-envTransform=fac.newTransform(Transform.ENVELOPED,(TransformParameterSpec)null);
List transformList=新建ArrayList();
transformList.add(exc14nTranform);
添加(envTransform);
Reference ref=fac.newReference(“”,fac.newDigestMethod(DigestMethod.SHA1,null),transformList,null,null);
SignedInfo si=fac.newSignedInfo(fac.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE,(C14NMethodParameterSpec)null)、fac.newSignatureMethod(SignatureMethod.RSA_SHA1,null)、Collections.singletonList(ref));
KeyStore ks=KeyStore.getInstance(“JKS”);
load(新文件输入流(“C:\\kstore.jks”),“kspassword.tocharray());
KeyStore.PrivateKeyEntry keyEntry=(KeyStore.PrivateKeyEntry)ks.getEntry(“别名”,新KeyStore.PasswordProtection(“kspassword.toCharArray()));
X509Certificate cert=(X509Certificate)keyEntry.getCertificate();
KeyInfoFactory kif=fac.getKeyInfoFactory();
List x509Content=new ArrayList();
X509IssuerSerial issuer=kif.newX509IssuerSerial(cert.getIssuerDN().toString(),cert.getSerialNumber());
System.out.println(证书getSubjectAlternativeNames().toString());
x509Content.add(cert.getSubjectX500Principal().getName());
x509Content.add(发行人);
x509Content.add(证书);
X509Data xd=kif.newX509Data(x509Content);
KeyInfo ki=kif.newKeyInfo(Collections.singletonList(xd));
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
Document doc=dbf.newDocumentBuilder().parse(新文件输入流(“C:\\myfile.xml”);
DOMSignContext dsc=新的DOMSignContext(keyEntry.getPrivateKey(),doc.getDocumentElement());
XMLSignature signature=fac.newXMLSignature(si,ki);
签名。签名(dsc);
OutputStream os=新文件OutputStream(“C:\\mysignedfile.xml”);
TransformerFactory tf=TransformerFactory.newInstance();
变压器变压器=tf.新变压器();
trans.transform(新的DOMSource(doc)、新的StreamResult(os));
}
}
我找到了答案,我在下面添加/修改了几行
Reference ref = fac.newReference("#object",fac.newDigestMethod(DigestMethod.SHA1, null));
Document doc = dbf.newDocumentBuilder().parse(new FileInputStream("C:\\myfile.xml"));
XMLStructure content = new DOMStructure(doc.getDocumentElement());
XMLObject obj = fac.newXMLObject(Collections.singletonList(content), "object", null, null);
DOMSignContext dsc = new DOMSignContext(keyEntry.getPrivateKey(), doc);
XMLSignature signature = fac.newXMLSignature(si, ki, Collections.singletonList(obj), null, null);