繁体   English   中英

如何在Java中将数字签名包含到xml文件中?

[英]How to do Enveloping digital signature to a xml file in java?

我有一个要求使用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));
}
}

我找到了答案,我在以下行中添加/修改了

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM