支持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<==>pkcs12private 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, 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());
//             KeyStore ks = KeyStore.getInstance("PKCS12");  //可以不经转换直接用pfx证书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<Object> 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();}/*** 2\ Enveloped-数据对象包含在与Signature元素相同的XML文档中,并且实际上把Signature包括为一个子元素。* * @param originalXmlFilePath* @param destnSignedXmlFilePath* @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 generateXMLDigitalSignatureByEnveloed(String originalXmlFilePath, String destnSignedXmlFilePath)throws NoSuchAlgorithmException, InvalidAlgorithmParameterException, KeyException, FileNotFoundException,SAXException, IOException, ParserConfigurationException, MarshalException, XMLSignatureException,TransformerException, KeyStoreException, CertificateException, UnrecoverableEntryException,InstantiationException, IllegalAccessException, ClassNotFoundException {// Create a DOM XMLSignatureFactory that will be used to// generate the enveloped signature.XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");// Create a Reference to the enveloped document (in this case,// you are signing the whole document, so a URI of "" signifies// that, and also specify the SHA1 digest algorithm and// the ENVELOPED Transform.Reference ref = fac.newReference("", fac.newDigestMethod(DigestMethod.SHA1, null),Collections.singletonList(fac.newTransform(Transform.ENVELOPED, (TransformParameterSpec) null)), null,null); // 这里与上面有点区别注意// Create the SignedInfo.SignedInfo si = fac.newSignedInfo(fac.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE, (C14NMethodParameterSpec) null),fac.newSignatureMethod(SignatureMethod.RSA_SHA1, null), Collections.singletonList(ref));// Load the KeyStore and get the signing key and certificate.KeyStore ks = KeyStore.getInstance("JKS");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();// Create the KeyInfo containing the X509Data.KeyInfoFactory kif = fac.getKeyInfoFactory();List<Object> x509Content = new ArrayList<>();x509Content.add(cert.getSubjectX500Principal().getName());x509Content.add(cert);X509Data xd = kif.newX509Data(x509Content);KeyInfo ki = kif.newKeyInfo(Collections.singletonList(xd));// Instantiate the document to be signed.DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();dbf.setNamespaceAware(true);Document doc = dbf.newDocumentBuilder().parse(new FileInputStream(originalXmlFilePath));// Create a DOMSignContext and specify the RSA PrivateKey and// location of the resulting XMLSignature's parent element.DOMSignContext dsc = new DOMSignContext(keyEntry.getPrivateKey(), doc.getDocumentElement());// Create the XMLSignature, but don't sign it yet.XMLSignature signature = fac.newXMLSignature(si, ki);// Marshal, generate, and sign the enveloped signature.signature.sign(dsc);// Output the resulting document.OutputStream os = new FileOutputStream(destnSignedXmlFilePath);TransformerFactory tf = TransformerFactory.newInstance();Transformer trans = tf.newTransformer();trans.transform(new DOMSource(doc), new StreamResult(os));os.close();}public static String signByEnveloed(SignCerAuth auth, String xml) throws Exception {// Create a DOM XMLSignatureFactory that will be used to// generate the enveloped signature.XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");// Create a Reference to the enveloped document (in this case,// you are signing the whole document, so a URI of "" signifies// that, and also specify the SHA1 digest algorithm and// the ENVELOPED Transform.Reference ref = fac.newReference("", fac.newDigestMethod(DigestMethod.SHA1, null),Collections.singletonList(fac.newTransform(Transform.ENVELOPED, (TransformParameterSpec) null)), null,null); // 这里与上面有点区别注意// Create the SignedInfo.SignedInfo si = fac.newSignedInfo(fac.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE, (C14NMethodParameterSpec) null),fac.newSignatureMethod(SignatureMethod.RSA_SHA1, null), Collections.singletonList(ref));// Load the KeyStore and get the signing key and certificate.KeyStore ks = KeyStore.getInstance("JKS");ks.load(new ByteArrayInputStream(Base64.getDecoder().decode(auth.getKeyStoreBytesBase64())),auth.getKeyStoreSignPassword().toCharArray());KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry) ks.getEntry(auth.getPrivateKey(),new KeyStore.PasswordProtection(auth.getPrivateKeyPassword().toCharArray()));X509Certificate cert = (X509Certificate) keyEntry.getCertificate();// Create the KeyInfo containing the X509Data.KeyInfoFactory kif = fac.getKeyInfoFactory();List<Object> x509Content = new ArrayList<>();x509Content.add(cert.getSubjectX500Principal().getName());x509Content.add(cert);X509Data xd = kif.newX509Data(x509Content);KeyInfo ki = kif.newKeyInfo(Collections.singletonList(xd));// Create the XMLSignature, but don't sign it yet.XMLSignature signature = fac.newXMLSignature(si, ki);// Instantiate the document to be signed.DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();dbf.setNamespaceAware(true);Document doc = dbf.newDocumentBuilder().parse(new ByteArrayInputStream(xml.getBytes()));// Create a DOMSignContext and specify the RSA PrivateKey and// location of the resulting XMLSignature's parent element.DOMSignContext dsc = new DOMSignContext(keyEntry.getPrivateKey(), doc.getDocumentElement());// Marshal, generate, and sign the enveloped signature.signature.sign(dsc);return docToString(doc);}/*** XML org.w3c.dom.Document 转 String*/public static String docToString(Document doc) {// XML转字符串String xmlStr = "";try {TransformerFactory tf = TransformerFactory.newInstance();Transformer t = tf.newTransformer();t.setOutputProperty("encoding", "UTF-8");ByteArrayOutputStream bos = new ByteArrayOutputStream();t.transform(new DOMSource(doc), new StreamResult(bos));xmlStr = bos.toString();} catch (TransformerConfigurationException e) {log.error("TransformerConfigurationException", e);} catch (TransformerException e) {log.error("TransformerException", e);}return xmlStr;}@Datapublic static class SignCerAuth {private String keyStoreBytesBase64;private String keyStoreSignPassword ;private String privateKey;private String privateKeyPassword;}public static void main(String[] a) throws Exception {long start = System.currentTimeMillis();SignCerAuth authTest = new SignCerAuth();authTest.setKeyStoreBytesBase64("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");authTest.setKeyStoreSignPassword(keyStoreSignFilePassword);authTest.setPrivateKey(privateKey);authTest.setPrivateKeyPassword(privateKeyPassword);String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" + "<root>\r\n" + "    <user>\r\n"+ "        <userId>userid</userId>\r\n" + "        <name>张三</name>\r\n"+ "        <userPassword>password</userPassword>\r\n" + "        <description>用户信息</description>\r\n"+ "    </user>\r\n" + "</root>";String sign = signByEnveloed(authTest, xml);log.info((System.currentTimeMillis() - start) + " : " + sign);//TODO 配置中心SignCerAuth authProd = new SignCerAuth();authProd.setKeyStoreBytesBase64("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");authProd.setKeyStoreSignPassword("ewtp-th");authProd.setPrivateKey("1");authProd.setPrivateKeyPassword("ewtp");sign = signByEnveloed(authProd, xml);log.info((System.currentTimeMillis() - start) + " : " + sign);}
}

常用工具类之十一 XML报文加签工具类 http://www.w3.org/2000/09/xmldsig相关推荐

  1. 记:.net中海关终端节点报文加签与推送

    keyInfoName 海关cer文件名, certificate 海关cer内容 DxpMsg dxpMsg = new DxpMsg(); XmlSerializerNamespaces name ...

  2. 电脑端便签工具推荐,电脑上好用的便签工具下载

    电脑上总有一些工具是人人都需要安装的工具,比如电脑端的便签工具,很多职场人在日常工作中都会用到电脑便签这一款工具,根据不同的使用场景,大家选择的便签工具也会有所差异. 怎么才能找到一款适合自己的电脑便 ...

  3. java aes 工具类_Java中的AES加解密工具类:AESUtils

    本人手写已测试,大家可以参考使用 package com.mirana.frame.utils.encrypt; import com.mirana.frame.constants.SysConsta ...

  4. 【flowable】十一、flowable加签和转签

    flowable加签和转签 加签 同时让多人处理任务,但是不同于网关操作. 1.向前加签 任务在A这里,A这个时候需要BCD核对一下,等BCD核对之后又回到A这里 2.向后加签 任务在A这里,A这个时 ...

  5. 密钥生成工具类:RSA2 256位 加解密工具类 RsaUtils

    import java.io.IOException; import java.security.*; import java.security.spec.PKCS8EncodedKeySpec; i ...

  6. 记:.net 海关179自行加签方法

    海关加签用的ukey加签方式,拼接报文 public class SignHelper     {         private const int REQUEST_TIME_WAIT = 200; ...

  7. php 海关对接 进口商品_GitHub - kipp01/haiguan: 海关对接 订单申报 php xml加签

    海关对接 订单申报 php xml加签 报文介绍 海关申报有进口申报和出口申报等,根据你的业务类型决定需要对接报文,具体可以咨询客服,本文是以进口订单申报来介绍报文加签申报的过程. 报文有两种:一种是 ...

  8. php 海关对接 进口商品_GitHub - baishaok/haiguan: 海关对接 订单申报 php xml加签

    海关对接 订单申报 php xml加签 报文介绍 海关申报有进口申报和出口申报等,根据你的业务类型决定需要对接报文,具体可以咨询客服,本文是以进口订单申报来介绍报文加签申报的过程. 报文有两种:一种是 ...

  9. springcloud 错误: 找不到或无法加载主类

    一个springcloud的多module项目.启动web的时候,出现报错. 错误: 找不到或无法加载主类 解决方案: 对无法加在主类的这个项目进行 clean install:

  10. 便签工具类产品推荐,办公便签软件哪个好

    电脑手机云便签 朋友推荐敬业签~ 在日常办公方面,很多人都离不开选择一款好用的便签工具,在电脑上使用便签工具,大家可以将一些比较重要的事情逐条记录在便签中,有些便签的功能比较齐全,还能设置时间提醒,实 ...

最新文章

  1. Java中Math类常用函数总结
  2. binary.Write 小坑一个兼论go的错误处理哲学
  3. 不同模块下包重名怎么解决_注册公司核名通不过,疑难核名有办法解决吗?
  4. Linux网卡配置出错无法联网-联网报错解决方法
  5. c语言图纸编号自动编号,【亲测能用】Auto CAD自动编号工具支持CAD2004-2020插件下载-羽兔网...
  6. Recyclerview-BRVAH使用
  7. Java实现微信公众号授权登录
  8. 项目中常见的沟通方式
  9. 计算机毕业设计springboot+vue基本微信小程序的考试系统
  10. 怎样清理软件卸载残留文件和系统垃圾
  11. 2020CADCG专题报告笔记 Jittor计图 深度学习框架
  12. cent怎么读(centre怎么读)
  13. 几种常见的开发语言对比
  14. matlab reff,R语言逻辑回归和泊松回归模型对发生交通事故概率建模
  15. 随笔 - 《为什么你在淘宝搜索的东西,会出现在抖音广告里?》-20201210
  16. 翻译:vscode官方文档 - 设置
  17. __gcd(x,y)函数 最大公约数
  18. mysql timestamp 默认_MySQL数据库TIMESTAMP怎么设置默认值 | 学步园
  19. sub html编辑器,目前前端开发必备编辑器有哪几款呢?
  20. JS高级 之 Promise 详解

热门文章

  1. 110道 Redis面试题及答案 (持续更新)
  2. 各个地图经纬度转换工具类
  3. 软件工程人才的社会需求现状与发展分析
  4. 重写和重载的区别和理解
  5. 信息差、技能差、资源差、认知差
  6. 概率论基础 - 5 - 马尔可夫不等式
  7. 窗口函数:计算环比和同比
  8. 网络中的公网和内网 (ipv4)
  9. 2019年全国一二线城市程序员工资大调查
  10. 怎么让图片铺满手机屏幕_手机版Photoshop怎么把图片铺满屏幕?