支持Signature封装和嵌入模式加签
package com.taylor.xml.customs.datahub;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
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.Base64;
import java.util.Collections;
import java.util.List;
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.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
import lombok.extern.slf4j.Slf4j;
import lombok.Data;
/**
* xml数字签名 工具类
*
* @author taylor
*
*/
@Slf4j
public class XMLSignUtils {
private static String keyStoreSignFilePath = "E:\\workspace\\inc\\service-s\\service-start\\src\\main\\resources\\ssl-bg\\test-net.keystore"; // "e:/gdmlh.pfx"
// 签名证书可以是经过转换后的keystore,也可以是pfx证书
// 用不同store,初始化实例类型不一样 keystore<==>jks
// pfx<==>pkcs12
private static String keyStoreSignFilePassword = "taylor-net"; // store 保护密码
private static String privateKey = "1"; // 别名
private static String privateKeyPassword = "taylor-net"; // 私钥保护密码
/**
* 1\封装模式
* 签名和原始xml文件内容在同一个XML文档中,原始xml文件内容作为签名的内部节点;Enveloping-数据对象包含在与Signature元素相同的XML文档中,并且被进一步包含在Signature元素(例如作为Object的子元素)中。
*
* @param originalXmlFilePath 待签名xml文件路径
* @param destnSignedXmlFilePath 签名后xml文件输出路径
* @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
* @author taylor
* @date 2020-10-13
*/
public static void generateXMLDigitalSignatureByEnveloping(String originalXmlFilePath,
String destnSignedXmlFilePath) throws NoSuchAlgorithmException, InvalidAlgorithmParameterException,
KeyException, FileNotFoundException, SAXException, IOException, ParserConfigurationException,
MarshalException, XMLSignatureException, TransformerException,