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

本文介绍了一种XML报文的加签工具类,详细讲解了如何使用Signature进行封装和嵌入模式的签名操作,为XML数据的安全传输提供保障。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

支持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,
Host: 192.168.8.157 User-Agent: gSOAP/2.7 Content-Type: application/soap+xml; charset=utf-8 Content-Length: 2571 Connection: close SOAPAction: "http://www.onvif.org/ver10/media/wsdl/SetOSD" <?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://tempuri.org/tns.xsd" xmlns:c14n="http://www.w3.org/2001/10/xml-exc-c14n#" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsa5="http://www.w3.org/2005/08/addressing" xmlns:xmime="http://www.w3.org/2004/06/xmlmime" xmlns:xop="http://www.w3.org/2004/08/xop/include" xmlns:tt="http://www.onvif.org/ver10/schema" xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2" xmlns:wsrf-bf="http://docs.oasis-open.org/wsrf/bf-2" xmlns:wstop="http://docs.oasis-open.org/wsn/t-1" xmlns:tds="http://www.onvif.org/ver10/device/wsdl" xmlns:tptz="http://www.onvif.org/ver20/ptz/wsdl" xmlns:timg="http://www.onvif.org/ver20/imaging/wsdl" xmlns:tmd="http://www.onvif.org/ver10/deviceIO/wsdl" xmlns:trt="http://www.onv   ? 5 廡?o o 璺#z-璺#?? E aE狜 @`永?,括澴v P钁澺6&#39;躊9 ? if.org/ver10/media/wsdl" xmlns:tr2="http://www.onvif.org/ver20/media/wsdl" xmlns:tan="http://www.onvif.org/ver20/analytics/wsdl" xmlns:tan_ae="http://www.onvif.org/ver20/analytics/wsdl/AnalyticsEngineBinding" xmlns:tan_re="http://www.onvif.org/ver20/analytics/wsdl/RuleEngineBinding" xmlns:tse="http://www.onvif.org/ver10/search/wsdl" xmlns:trp="http://www.onvif.org/ver10/replay/wsdl" xmlns:tplt="http://www.onvif.org/ver10/plus/schema" xmlns:tpl="http://www.onvif.org/ver10/plus/wsdl"><SOAP-ENV:Header><wsse:Security SOAP-ENV:mustUnderstand="true"><wsse:UsernameToken><wsse:Username>admin</wsse:Username><wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">PtST+b5TgV0i1bNeVY1rBLxFgC0=</wsse:Password><wsse:Nonce>NjgyMzEwM2Y1NTU2MWY0AA==</wsse:Nonce><wsu:Created>2025-05-13T09:26:23Z</wsu:Created></wsse:UsernameToken></wsse:Security></SOAP-ENV:Header><SOAP-ENV:Body><trt:SetOSD><trt:OSD token="OsdTokenName_0"><tt:VideoSourceConfigurationToken>videoSourceToken</tt:VideoSourceConfigurationToken><tt:Type>Text</tt:Type><tt:Position><tt:Type>Custom</tt:Type><tt:Pos y="-0.815999985" x="0.824000001"></tt:Pos></tt:Position><tt:TextString><tt:Type>Plain</tt:Type><tt:PlainText>HIPC</tt:PlainText></tt:TextString></trt:OSD></trt:SetOSD></SOAP-ENV:Body></SOAP-ENV:Envelope> ?  \ 5 礣?< < 璺#?蓁?z- E (瀵@ @?括澙?, P譾?&#39;荑?漃^.T \  \ 5 昜?< < 璺#?蓁?z- E (灏@ @?括澙?, P譾?&#39;荑?諴"8&A \  h 5 4隆G G 璺#?蓁?z- E 9灞@ @朋括澙?, P譾?&#39;荑?諴"8fc HTTP/1.0 200 OK h  \ 5 谩< < 璺#z-璺#?? E (E獲 @f 括,括澴v P钁舟6&#39;鞵9` \  ? 5 拭?? ? 璺#?蓁?z- E 体睝 @腳括澙?, P譾?&#39;龛?諴"8酗 Content-Type: application/soap+xml; charset=utf-8 Content-Length: 327 Connection: close <?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding" xmlns:trt="http://www.onvif.org/ver10/media/wsdl"> <SOAP-ENV:Header /> <SOAP-ENV:Body> <trt:SetOSDResponse /> </SOAP-ENV:Body> </SOAP-ENV:Envelope> 参考这个,现在要开发一个控制ipc摄像头水印开关的android app,怎么做
05-29
<?xml version="1.0" encoding="utf-8"?> <asmv1:assembly xsi:schemaLocation="urn:schemas-microsoft-com:asm.v1 assembly.adaptive.xsd" manifestVersion="1.0" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns="urn:schemas-microsoft-com:asm.v2" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xrml="urn:mpeg:mpeg21:2003:01-REL-R-NS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:co.v1="urn:schemas-microsoft-com:clickonce.v1" xmlns:co.v2="urn:schemas-microsoft-com:clickonce.v2"> <assemblyIdentity name="ExcelAddIn.vsto" version="1.0.0.8" publicKeyToken="fe59c7eecc11e67f" language="neutral" processorArchitecture="msil" xmlns="urn:schemas-microsoft-com:asm.v1" /> <description asmv2:publisher="立臻精密" asmv2:product="ExcelAddIn" xmlns="urn:schemas-microsoft-com:asm.v1" /> <deployment install="false" /> <compatibleFrameworks xmlns="urn:schemas-microsoft-com:clickonce.v2"> <framework targetVersion="4.8" profile="Full" supportedRuntime="4.0.30319" /> </compatibleFrameworks> <dependency> <dependentAssembly dependencyType="install" codebase="ExcelAddIn.dll.manifest" size="34123"> <assemblyIdentity name="ExcelAddIn.dll" version="1.0.0.8" publicKeyToken="fe59c7eecc11e67f" language="neutral" processorArchitecture="msil" type="win32" /> <hash> <dsig:Transforms> <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" /> </dsig:Transforms> <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" /> <dsig:DigestValue>7h1oTP8TOXK/+e0OJsRMsoRbwB7terGyB3yg+geUCnw=</dsig:DigestValue> </hash> </dependentAssembly> </dependency> <publisherIdentity name="CN=LUXSAN\MH1364778" issuerKeyHash="7796fbeb81e386aeec8a6a04e67b966d96724583" /><Signature Id="StrongNameSignature" xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha256" /><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" /><DigestValue>xE7O3sm6ah3WnSSXjTAfgvio+3+Esp3FsFHT2Lz6g9I=</DigestValue></Reference></SignedInfo><SignatureValue>i5oDFi3o79ljponZhIQXv5BDLosMR3k2Hg2Bm6/vdMnFDojRwRVTK6Ndw1dJ4/mkNYlL+jt7Mp0ussuafQQ1AcX3rhj/FV2Xo/yjVwV+oLdZ5fSUW+MGELp5f4MJaHuqVd223PHqKyvzXAAVgVfDRmrZkcaeSjzldM6OZMk9wsY=</SignatureValue><KeyInfo Id="StrongNameKeyInfo"><KeyValue><RSAKeyValue><Modulus>vgcvHY1J6LgYk7kL5RzIzmNQrZThIpzy5XmDXX3HzFHZXvgEGCsGlyM41Gqo868bWTpI4OnSAcIhq0VN2RBK49SwlNw89xU0nkm2sitJR5CJBKPYbT0nDilFwcT53QsawsazS19sBU+x+8UcGqoo3+/7clnW2+SVg+ZsLGSDfa0=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue></KeyValue><msrel:RelData xmlns:msrel="http://schemas.microsoft.com/windows/rel/2005/reldata"><r:license xmlns:r="urn:mpeg:mpeg21:2003:01-REL-R-NS" xmlns:as="http://schemas.microsoft.com/windows/pki/2005/Authenticode"><r:grant><as:ManifestInformation Hash="d283fabcd8d351b0c59db2847ffba8f8821f308d97249dd61d6abac9dece4ec4" Description="" Url=""><as:assemblyIdentity name="ExcelAddIn.vsto" version="1.0.0.8" publicKeyToken="fe59c7eecc11e67f" language="neutral" processorArchitecture="msil" xmlns="urn:schemas-microsoft-com:asm.v1" /></as:ManifestInformation><as:SignedBy /><as:AuthenticodePublisher><as:X509SubjectName>CN=LUXSAN\MH1364778</as:X509SubjectName></as:AuthenticodePublisher></r:grant><r:issuer><Signature Id="AuthenticodeSignature" xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha256" /><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" /><DigestValue>1JW1ksk/7emH97n4+IqpkVCpAeuRn2iN8fMd80lkJDQ=</DigestValue></Reference></SignedInfo><SignatureValue>WtfWb48IWj9oUnhDfjED1icJiAgWV6lmcErMQgqvuAZre3/elFJfnDPD9FSFzHPwB2AE25pv+W7b1xmki/2cpzM8YoecwFNStYDW5gklw35XVdx71QWWfe7YiuIVsp9VvgNQsv35NqJdk1CzdlfwX9QLJuDHOcyXjfnIVE78Huw=</SignatureValue><KeyInfo><KeyValue><RSAKeyValue><Modulus>vgcvHY1J6LgYk7kL5RzIzmNQrZThIpzy5XmDXX3HzFHZXvgEGCsGlyM41Gqo868bWTpI4OnSAcIhq0VN2RBK49SwlNw89xU0nkm2sitJR5CJBKPYbT0nDilFwcT53QsawsazS19sBU+x+8UcGqoo3+/7clnW2+SVg+ZsLGSDfa0=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue></KeyValue><X509Data><X509Certificate>MIIB2TCCAUKgAwIBAgIQPkedkeosGKdOyr5FB66xKTANBgkqhkiG9w0BAQsFADArMSkwJwYDVQQDHiAATABVAFgAUwBBAE4AXABNAEgAMQAzADYANAA3ADcAODAeFw0yNTA0MTEwNTIwMTZaFw0yNjA0MTExMTIwMTZaMCsxKTAnBgNVBAMeIABMAFUAWABTAEEATgBcAE0ASAAxADMANgA0ADcANwA4MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+By8djUnouBiTuQvlHMjOY1CtlOEinPLleYNdfcfMUdle+AQYKwaXIzjUaqjzrxtZOkjg6dIBwiGrRU3ZEErj1LCU3Dz3FTSeSbayK0lHkIkEo9htPScOKUXBxPndCxrCxrNLX2wFT7H7xRwaqijf7/tyWdbb5JWD5mwsZIN9rQIDAQABMA0GCSqGSIb3DQEBCwUAA4GBAHoTlXf4TY49Bwn3I+zYUXeyUmSxYV1mrN92A8u8hM4b9BdNnCwPq4kMV942a67wjbdWwWHkYSt3IIuIhcsGEdJ9noA7+n6v/ytzXPovdFNxiNE184wDwYhvTAFtC5RGCCCmKtBrfqBr1yfq6J54Jc1qE0LPxuP7Vn191VBjATgK</X509Certificate></X509Data></KeyInfo></Signature></r:issuer></r:license></msrel:RelData></KeyInfo></Signature></asmv1:assembly>
08-10
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值