xml数字签名

package


import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URISyntaxException;
import java.security.InvalidAlgorithmParameterException;
import java.security.KeyException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableEntryException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;


import javax.xml.crypto.MarshalException;
import javax.xml.crypto.dom.DOMStructure;
import javax.xml.crypto.dsig.CanonicalizationMethod;
import javax.xml.crypto.dsig.DigestMethod;
import javax.xml.crypto.dsig.Reference;
import javax.xml.crypto.dsig.SignatureMethod;
import javax.xml.crypto.dsig.SignedInfo;
import javax.xml.crypto.dsig.Transform;
import javax.xml.crypto.dsig.XMLObject;
import javax.xml.crypto.dsig.XMLSignature;
import javax.xml.crypto.dsig.XMLSignatureException;
import javax.xml.crypto.dsig.XMLSignatureFactory;
import javax.xml.crypto.dsig.dom.DOMSignContext;
import javax.xml.crypto.dsig.keyinfo.KeyInfo;
import javax.xml.crypto.dsig.keyinfo.KeyInfoFactory;
import javax.xml.crypto.dsig.keyinfo.X509Data;
import javax.xml.crypto.dsig.keyinfo.X509IssuerSerial;
import javax.xml.crypto.dsig.spec.C14NMethodParameterSpec;
import javax.xml.crypto.dsig.spec.TransformParameterSpec;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;


import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.XMLWriter;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;


import com.abacus.common.utils.StringUtil;
import com.abacus.dss.srcinf.cgrk;
import com.abacus.dss.srcinf.kc;
import com.abacus.dss.srcinf.pfck;
import com.abacus.dss.srcinf.pfthrk;
import com.abacus.dss.srcinf.thck;
import com.abacus.xpos.foundation.pubs.WebserviceException;
import com.alibaba.fastjson.JSONObject;


@SuppressWarnings("restriction")
public class UploadTransfer{
private static final Properties props;
static{
props = new Properties();
InputStream inputStream = UploadTransfer.class.getResourceAsStream("/keystore_https_detail.properties");
try {
props.load(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}

private static String originalXmlFilePath;
private static String destnSignedXmlFilePath;
protected static String keyStoreSignFilePathName=props.getProperty("keyStoreSignFilePathName");;//签名证书名称
protected static String keyStoreLocalFilePathName=props.getProperty("keyStoreLocalFilePathName");;//本地证书 https请求验证使用
protected static String keyStoreSignFilePath;
protected static String keyStoreLocalFilePath;
protected static String keyStoreSignFilePassword=props.getProperty("keyStoreSignFilePassword");//签名证书密码
protected static String keyStoreLocalFilePassword=props.getProperty("keyStoreLocalFilePassword");//https请求证书密码
protected static String privateKey=props.getProperty("privateKey");
private static String privateKeyPassword=props.getProperty("privateKeyPassword");
private static String url=props.getProperty("uploadUrl");
public UploadTransfer(){
   originalXmlFilePath =  this.getClass().getResource("/").getPath()+"upload/data.xml";
destnSignedXmlFilePath =  this.getClass().getResource("/").getPath()+"upload/signFile.xml";
keyStoreSignFilePath = this.getClass().getResource("/").getPath()+keyStoreSignFilePathName;
System.out.println(originalXmlFilePath);
}

@SuppressWarnings({ "restriction", "unchecked" })
/**
 * xml数字签名 封装模式
 * @param originalXmlFilePath
 * @param destnSignedXmlFilePath
 * @param privateKeyFilePath
 * @param publicKeyFilePath
 * @throws NoSuchAlgorithmException
 * @throws InvalidAlgorithmParameterException
 * @throws KeyException
 * @throws FileNotFoundException
 * @throws SAXException
 * @throws IOException
 * @throws ParserConfigurationException
 * @throws MarshalException
 * @throws XMLSignatureException
 * @throws TransformerException
 * @throws KeyStoreException
 * @throws CertificateException
 * @throws UnrecoverableEntryException
 * @throws InstantiationException
 * @throws IllegalAccessException
 * @throws ClassNotFoundException
 */
public static void generateXMLDigitalSignature(String originalXmlFilePath, String destnSignedXmlFilePath)
    throws NoSuchAlgorithmException, InvalidAlgorithmParameterException, KeyException, FileNotFoundException, SAXException, IOException, ParserConfigurationException, MarshalException, XMLSignatureException, TransformerException, KeyStoreException, CertificateException, UnrecoverableEntryException, InstantiationException, IllegalAccessException, ClassNotFoundException
  {
    XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");
    Reference ref = fac.newReference
    ("#DataObjectId", fac.newDigestMethod(DigestMethod.SHA1, null),
     Collections.singletonList
      (fac.newTransform
       (Transform.ENVELOPED, (TransformParameterSpec) null)),
        null, null);
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    dbf.setNamespaceAware(true);
    org.w3c.dom.Document doc = dbf.newDocumentBuilder().parse(new FileInputStream(originalXmlFilePath));
    org.w3c.dom.Element documentElement = doc.getDocumentElement();
    DOMStructure domStructure = new DOMStructure(documentElement);
    XMLObject newXMLObject = fac.newXMLObject(Collections.singletonList(domStructure), "DataObjectId", 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(KeyStore.getDefaultType());
    ks.load(new FileInputStream(keyStoreSignFilePath), keyStoreSignFilePassword.toCharArray());
    KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry)ks.getEntry(privateKey, new KeyStore.PasswordProtection(privateKeyPassword.toCharArray()));
    X509Certificate cert = (X509Certificate)keyEntry.getCertificate();
 /*   //直接读取证书
    CertificateFactory cf = CertificateFactory.getInstance("X.509");
    FileInputStream fis = new FileInputStream(new File("e:/gdmlhenc.cer"));
    X509Certificate cert = (X509Certificate) cf.generateCertificate(fis);
    fis.close();
    PublicKey publicKey = cert.getPublicKey();*/
    KeyInfoFactory kif = fac.getKeyInfoFactory();
    X509IssuerSerial newX509IssuerSerial = kif.newX509IssuerSerial(cert.getIssuerX500Principal().getName(), cert.getSerialNumber());
    List x509Content = new ArrayList();
    x509Content.add(newX509IssuerSerial);
    x509Content.add(cert);
    X509Data xd = kif.newX509Data(x509Content);
    KeyInfo ki = kif.newKeyInfo(Collections.singletonList(xd));


    XMLSignature signature = fac.newXMLSignature(si, ki,Collections.singletonList(newXMLObject),null,null);
    Document newDocument = dbf.newDocumentBuilder().newDocument();
    DOMSignContext dsc = new DOMSignContext(keyEntry.getPrivateKey(), newDocument);
    signature.sign(dsc);
    OutputStream os = new FileOutputStream(destnSignedXmlFilePath);
    TransformerFactory tf = TransformerFactory.newInstance();
    Transformer trans = tf.newTransformer();
    trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");//不要头信息
    trans.transform(new DOMSource(newDocument.getDocumentElement()), new StreamResult(os));
    os.close();

  }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值