如何在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

我需要使用java对xml文件进行封装数字签名,目前我可以使用封装数字签名进行签名。谁能帮我做信封签名??我的信封签名代码:

//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);