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