Java等效于C#XML签名方法

Java等效于C#XML签名方法,第1张

Java等效于C#XML签名方法

以下在Java中做同样的事情。它需要磁盘上的PKCS12证书文件。

import java.util.*;import java.io.*;import java.security.KeyStore;import java.security.KeyStore.PrivateKeyEntry;import java.security.cert.X509Certificate;import javax.xml.crypto.dsig.*;import javax.xml.crypto.dsig.dom.DOMSignContext;import javax.xml.crypto.dsig.keyinfo.*;import javax.xml.crypto.dsig.spec.*;import javax.xml.parsers.documentBuilderFactory;import javax.xml.transform.*;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import org.w3c.dom.document;public class XMLSigner {    public static void signXmldocumentonDisk(String fileToBeSignedPath, String signedFileSavePath, String pkcs12CertificateFilePath, String password) throws Exception {        XMLSignatureFactory fac = getXMLSignatureFactory();        Reference ref = getSHA1WholedocumentEnvelopedTransformReference(fac);        SignedInfo si = getSignedInfo(fac, ref);        PrivateKeyEntry keyEntry = loadPKCS12KeyStoreAndGetSigningKeyEntry(pkcs12CertificateFilePath, password);        KeyInfo ki = getKeyInfoWithX509Data(keyEntry, fac);        document doc = instantiatedocumentToBeSigned(fileToBeSignedPath);        signdocumentAndPlaceSignatureAsFirstChildElement(doc, keyEntry, fac, si, ki);        writeResultingdocument(doc, signedFileSavePath);    }    private static XMLSignatureFactory getXMLSignatureFactory() {        return XMLSignatureFactory.getInstance("DOM");    }    private static Reference getSHA1WholedocumentEnvelopedTransformReference(XMLSignatureFactory fac) throws Exception {        return  fac.newReference(     "",      fac.newDigestMethod(DigestMethod.SHA1, null),     Collections.singletonList(fac.newTransform(Transform.ENVELOPED, (TransformParameterSpec) null)),     null,      null );    }    private static SignedInfo getSignedInfo(XMLSignatureFactory fac, Reference ref) throws Exception {        return  fac.newSignedInfo(     fac.newCanonicalizationMethod(         CanonicalizationMethod.INCLUSIVE,          (C14NMethodParameterSpec) null     ),     fac.newSignatureMethod(SignatureMethod.RSA_SHA1, null),     Collections.singletonList(ref) );    }    private static PrivateKeyEntry loadPKCS12KeyStoreAndGetSigningKeyEntry(String pkcs12CertificateFilePath, String password) throws Exception {        KeyStore ks = KeyStore.getInstance("PKCS12");        ks.load(new FileInputStream(pkcs12CertificateFilePath), password.toCharArray()); return (PrivateKeyEntry)ks.getEntry(ks.aliases().nextElement(), new KeyStore.PasswordProtection(password.toCharArray()));    }    private static KeyInfo getKeyInfoWithX509Data(PrivateKeyEntry keyEntry, XMLSignatureFactory fac) {        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);        return kif.newKeyInfo(Collections.singletonList(xd));    }    private static document instantiatedocumentToBeSigned(String fileToBeSignedPath) throws Exception {        documentBuilderFactory dbf = documentBuilderFactory.newInstance();        dbf.setNamespaceAware(true);        return dbf.newdocumentBuilder().parse(new FileInputStream(fileToBeSignedPath));    }    private static void signdocumentAndPlaceSignatureAsFirstChildElement(document doc, PrivateKeyEntry keyEntry, XMLSignatureFactory fac, SignedInfo si, KeyInfo ki) throws Exception {        DOMSignContext dsc = new DOMSignContext(keyEntry.getPrivateKey(), doc.getdocumentElement(), doc.getdocumentElement().getFirstChild());        XMLSignature signature = fac.newXMLSignature(si, ki);        signature.sign(dsc);    }    private static void writeResultingdocument(document doc, String signedFileSavePath) throws Exception {        OutputStream os = new FileOutputStream(signedFileSavePath);        TransformerFactory tf = TransformerFactory.newInstance();        Transformer trans = tf.newTransformer();        trans.transform(new DOMSource(doc), new StreamResult(os));    }}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5561159.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存