问题描述
我正在尝试使用xml签名,但是有三个参考。例如:第一个是<Reference URI="#keyInfoId">
,第二个是<Reference URI="">
,第三个是<Reference>
。我不知道如何创建它们。当我使用这样的Java代码:XMLSignatureFactory.getInstance("DOM").newReference(String uri,DigestMethod dm,List transforms,String type,String id)
时,第一个参数 uri 是什么?当我给它null时,它将引发异常。请帮助我!
xml是:
<MessagePayload><AppHdr xmlns="urn:iso:std:iso:20022:tech:xsd:head.001.001.01"><CharSet>UTF-8</CharSet><Fr><OrgId><Nm>QCA</Nm></OrgId></Fr><To><OrgId><Nm>JP2M</Nm></OrgId></To><BizMsgidr>QCA-202008250175315610</BizMsgidr><MsgDefIdr>pacs.008.001.06</MsgDefIdr><CreDt>2020-08-25T09:56:26.263Z</CreDt><Sgntr></Sgntr></AppHdr><Document xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.06"><FIToFICstmrCdtTrf><GrpHdr><Msgid>QCA-202008250175315610</Msgid><CreDtTm>2020-08-25T09:56:26</CreDtTm><NbOfTxs>1</NbOfTxs><SttlmInf><SttlmMtd>CLRG</SttlmMtd></SttlmInf><InstgAgt><FinInstnId><Othr><Id>0731</Id></Othr></FinInstnId></InstgAgt><InstdAgt><FinInstnId><Othr><Id>JP2M</Id></Othr></FinInstnId></InstdAgt></GrpHdr><CdtTrftxInf><PmtId><EndToEndId>1861759857</EndToEndId><TxId>1861759857</TxId></PmtId><PmtTpInf><CtgyPurp><Prtry>4</Prtry></CtgyPurp></PmtTpInf><IntrBkSttlmAmt Ccy="HKD">300</IntrBkSttlmAmt><AccptncDtTm>2020-08-25T09:56:26</AccptncDtTm><ChrgBr>SLEV</ChrgBr><Dbtr/><DbtrAcct><Id><Othr><Id>731123456789</Id><SchmeNm><Prtry>ACCNO</Prtry></SchmeNm></Othr></Id><Tp><Prtry>01</Prtry></Tp><Ccy>HKD</Ccy></DbtrAcct><DbtrAgt><FinInstnId/></DbtrAgt><CdtrAgt><FinInstnId><Othr><Id>00000124</Id><SchmeNm><Prtry>ACQID</Prtry></SchmeNm></Othr></FinInstnId></CdtrAgt><Cdtr><Nm>Testing Bank QTB</Nm><Id><OrgId><Othr><Id>00000124</Id><SchmeNm><Prtry>MERID</Prtry></SchmeNm></Othr></OrgId></Id></Cdtr></CdtTrftxInf><SplmtryData><Envlp><Cnts><InvoiceNo>123456789012543154</InvoiceNo><ARFlag>A</ARFlag></Cnts></Envlp></SplmtryData></FIToFICstmrCdtTrf></Document></MessagePayload>
签名后为:
<MessagePayload><AppHdr xmlns="urn:iso:std:iso:20022:tech:xsd:head.001.001.01"><CharSet>UTF-8</CharSet><Fr><OrgId><Nm>QCA</Nm></OrgId></Fr><To><OrgId><Nm>JP2M</Nm></OrgId></To><BizMsgidr>QCA-202008250175315610</BizMsgidr><MsgDefIdr>pacs.008.001.06</MsgDefIdr><CreDt>2020-08-25T09:56:26.263Z</CreDt><Sgntr><Signature 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/2001/04/xmldsig-more#rsa-sha256"/><Reference URI="#keyInfoId"><Transforms><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/><DigestValue>iXDyEv9hq7mzMJaxB13qCgFKPTlt4V2LsevI/lzjjKQ=</DigestValue></Reference><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/2001/04/xmlenc#sha256"/><DigestValue>2uFSw9pgGjvGFDaVum3TKv/lolb5+PKmfK7uE45CsNc=</DigestValue></Reference><Reference><Transforms><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/><DigestValue>9DchQ9bukgOmxgWeOKiTrpvt4of02SGElsaajVStNJg=</DigestValue></Reference></SignedInfo><SignatureValue>dzXh/eGRnc5gvQJJVHqQaKmhmwRWWISOGjHpj0yTTBjPBghm8eNn6MZRrKcuXLT4fpGeB9iZVy/D
IKhs1eTEadVNDpZsDqNcpKM74mFfPMNVpv1A5cb5pF8MYOQ/OW0NhL+KGoHitM4qSSLIhE5dDblS
xl1tCu2mnxRUyEgW1K5Zo7rV3C4jP9e4NUZZDhv9LZ9SNyPgTqxKuxU3OENS1phjFCRWn2sdGq5P
3FejwOHkZUkd9KsabmpHomr/kaULSW77U8CUS6HUpKWKx1dd47YOI14ul5g0AKbde37TguDdc91L
SWwbqc3yK+iQvK1DbbuMVVM+Z+dFvAz64HFw4Q==</SignatureValue><KeyInfo Id="keyInfoId"><X509Data><X509Certificate>MIIEQTCCAymgAwIBAgIEd84q6DANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCSEsxMTAvBgNV
BAoTKERJR0ktU0lHTiBDRVJUSUZJQ0FUSU9OIFNFUlZJQ0VTIExJTUlURUQxGTAXBgNVBAsTEEJS
TiAzMTM0Njk1Mi0wMDAxMjAwBgNVBAMTKUdFTkVSQUwgUFVSUE9TRSBTSUdOSU5HIENBIENFUlQg
MyAoVFJJQUwpMB4XDTE3MDMzMDEwMjMxN1oXDTIwMDMzMDEwMjMxN1owgYkxCzAJBgNVBAYTAkhL
MScwJQYDVQQKEx5EUyBHRU5FUkFMIFBVUlBPU0UgQ0xJRU5UIENFUlQxDjAMBgNVBAsTBUpFVENP
MREwDwYDVQQLEwg5MDA4MTY4MjEuMCwGA1UEAxMlSk9JTlQgRUxFQ1RST05JQyBURUxMRVIgU0VS
VklDRVMgTFRELjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQocggEBANqh+DVi1OLlLfxmuLGd
hwhI77cwTnt474wdJMG3xcJwUpraFH0CKvZ8Gy/cmofVZYEQpOgWw2ztgm01RME67yZpJ0PQY1Ur
N9C/3ZxnuzaQeWGwlF/BfH+/uPOc5YrAfOxu3RWVwT4Y1n4XSS5kJtsW8li2MdtCuecsRXxjBXcH
eLvMaG9+roIp6bncsWPHPWWrflrE9RyGX2mYmSzo0VxS8MgBSvZY3tY4BPsgO3UMAx6esEKtxJiA
mKUtGAMgcGdS/pAzcycJNFdaHiACLH2TA1r0Mc5lrWHJ4HrkYw8xO2HaN8vJXSlvNvFCnAma/LK8
dzJskj82T9sKivx0qTUCAwEAAaOBqDCBpTA0BgNVHSAELTArMCkGCCsGAQQBwWQEMB0wGwYIKwYB
BQUHAgEWD3d3dy5kZy1zaWduLmNvbTAJBgNVHRMEAjAAMB4GA1UdEQQXMBWBE3N5c21hbkBqZXRj
by5jb20uaGswEQYJYIZIAYb4QgEBBAQDAgWgMA4GA1UdDwEB/wQEAwIF4DAfBgNVHSMEGDAWgBQu
lhyBHzUuhF5/XhV6VOixnyLz0TANBgkqhkiG9w0BAQsFAAOCAQEA7mmR49m79dugAn8GE01GRfUo
aAIagwuNlXyGraU9pKIDwk1jWhx769vMTS4P5Y+KRwmW1t34B6cfvoIXBoxGUFICpv8RgnRhkOxP
J5qVs7owhr5EV4zAfHYdDETRPfFfFsrmyTQVLCPjkJttCFjQA9fWdHVfMlt0mB+uliE9knQyM4lO
8ohnx5yrjxT7xpR3bhsQn/TOXaV3Xevec6CpIiHU5qoULcruvzhpCTSWhtJFjMkP4ZSyeOKW9ek8
UCKrlxQV+dH2MNH2mHs9P5NAB8cKTYdvZninmNgzs/vjGI6xSavHH4dhRadK0JWJKgYQr8kEsMEa
PzfZG/6gEt3P==</X509Certificate></X509Data></KeyInfo></Signature></Sgntr></AppHdr><Document xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.06"><FIToFICstmrCdtTrf><GrpHdr><Msgid>QCA-202008250175315610</Msgid><CreDtTm>2020-08-25T09:56:26</CreDtTm><NbOfTxs>1</NbOfTxs><SttlmInf><SttlmMtd>CLRG</SttlmMtd></SttlmInf><InstgAgt><FinInstnId><Othr><Id>0731</Id></Othr></FinInstnId></InstgAgt><InstdAgt><FinInstnId><Othr><Id>JP2M</Id></Othr></FinInstnId></InstdAgt></GrpHdr><CdtTrftxInf><PmtId><EndToEndId>1861759857</EndToEndId><TxId>1861759857</TxId></PmtId><PmtTpInf><CtgyPurp><Prtry>4</Prtry></CtgyPurp></PmtTpInf><IntrBkSttlmAmt Ccy="HKD">300</IntrBkSttlmAmt><AccptncDtTm>2020-08-25T09:56:26</AccptncDtTm><ChrgBr>SLEV</ChrgBr><Dbtr/><DbtrAcct><Id><Othr><Id>731123456789</Id><SchmeNm><Prtry>ACCNO</Prtry></SchmeNm></Othr></Id><Tp><Prtry>01</Prtry></Tp><Ccy>HKD</Ccy></DbtrAcct><DbtrAgt><FinInstnId/></DbtrAgt><CdtrAgt><FinInstnId><Othr><Id>00000124</Id><SchmeNm><Prtry>ACQID</Prtry></SchmeNm></Othr></FinInstnId></CdtrAgt><Cdtr><Nm>Testing Bank QTB</Nm><Id><OrgId><Othr><Id>00000124</Id><SchmeNm><Prtry>MERID</Prtry></SchmeNm></Othr></OrgId></Id></Cdtr></CdtTrftxInf><SplmtryData><Envlp><Cnts><TxnInfo>MDAwMjAxMDEwMjEyMzI5NjAwMTRoay5jb20uamV0Y28uMTAxNzQwMDAwMDEyNCAgICAgICAgICAgMTIzNDU2Nzg5MDEyNTQzMTU0MDgyNTM0NDA4MjUwOTU2MjE1NDMxNTQwMTI0MDAwMk40NjAxMTMzODUwMDE0aGsuY29tLmpldGNvLjIwMTYzMDQwMDA2MDAwMDAwMDAwMzQ0MDAwMTAwMDIwMzQ0MDAwMTAwMDIwMzQ0MDAwNTAwMDIwMzQ0MDAxMDAwMDIwMzQ5NzAwMTRoay5jb20uamV0Y28uMzAxMTUwMDAwMDEyNCAgICAgICAwMjMwVGVzdgluZyBCYW5rIFFUQiAgICAgICAgICAgICAgMDMxnuhLICAgICAgICAgICAgIDA0MDMwMDAzNTc1MDAxNGhrLmNvbS5qZXRjby40MDExNzIwMjAwODI1MDk1NjI0MDAwMDIzMjllMzU0NzMyOWU0YTBjYzg2MmQ4MzdhYjVkNzBhYWJjNTIwNDYwMTE1MzAzMDAwNTQxMjAwMDAwMDAwMDAwMDU4MDJISzU5MDQwMTI0NjAxnuhLICAgICAgICAgICAgIDYzMDRBQzRB</TxnInfo><InvoiceNo>123456789012543154</InvoiceNo><ARFlag>A</ARFlag></Cnts></Envlp></SplmtryData></FIToFICstmrCdtTrf></Document></MessagePayload>
消化<AppHdr ….>……<Sgntr></Sgntr></AppHdr>
消化<KeyInfo>...</KeyInfo>
没有uri attr的将消化<Document …..>…..</Document>
这是我的测试代码:
package xml;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.io.StringWriter;
import java.security.InvalidAlgorithmParameterException;
import java.security.KeyStore;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import javax.xml.crypto.MarshalException;
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.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.dom.DOMValidateContext;
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.spec.C14NMethodParameterSpec;
import javax.xml.crypto.dsig.spec.TransformParameterSpec;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
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.dom4j.DocumentException;
import org.dom4j.io.DOMWriter;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import testHttps.MyProperties;
public class Demo02 {
private static final XMLSignatureFactory XML_SIGNATURE_FACTORY = XMLSignatureFactory.getInstance("DOM");
private static final TransformerFactory TRANSFORMER_FACTORY = TransformerFactory.newInstance();
private static final String RSA_SHA256 = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256";
private static final String TRANSFORM_01 = "http://www.w3.org/2001/10/xml-exc-c14n#";
private static final String KEY_INFO_ID = "keyInfoId";
public static Transform getTransform(String algorithm)
throws NoSuchAlgorithmException,InvalidAlgorithmParameterException {
return XML_SIGNATURE_FACTORY.newTransform(algorithm,(TransformParameterSpec) null);
}
// 第一個reference
/**
* <Reference URI="#keyInfoId"> <Transforms>
* <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
* </Transforms>
* <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
* <DigestValue>iXDyEv9hq7mzMJaxB13qCgFKPTlt4V2LsevI/lzjjKQ=</DigestValue>
* </Reference>
*
* @param uri
* @return
* @throws NoSuchAlgorithmException
* @throws InvalidAlgorithmParameterException
*/
public static Reference getReference01() throws NoSuchAlgorithmException,InvalidAlgorithmParameterException {
DigestMethod digestMethod = XML_SIGNATURE_FACTORY.newDigestMethod(DigestMethod.SHA256,null);
List<Transform> transforms = Collections.singletonList(getTransform(TRANSFORM_01));
return XML_SIGNATURE_FACTORY.newReference("#" + KEY_INFO_ID,digestMethod,transforms,null,null);
}
// 第二個
/**
* <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/2001/04/xmlenc#sha256"/>
* <DigestValue>2uFSw9pgGjvGFDaVum3TKv/lolb5+PKmfK7uE45CsNc=</DigestValue>
* </Reference>
*
* @return
* @throws NoSuchAlgorithmException
* @throws InvalidAlgorithmParameterException
*/
public static Reference getReference02() throws NoSuchAlgorithmException,null);
List<Transform> transforms = new ArrayList<Transform>();
transforms.add(getTransform(Transform.ENVELOPED));
transforms.add(getTransform(TRANSFORM_01));
return XML_SIGNATURE_FACTORY.newReference("",null);
}
// 第三個
/**
* <Reference> <Transforms>
* <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
* </Transforms>
* <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
* <DigestValue>9DchQ9bukgOmxgWeOKiTrpvt4of02SGElsaajVStNJg=</DigestValue>
* </Reference>
*
* @return
* @throws NoSuchAlgorithmException
* @throws InvalidAlgorithmParameterException
*/
public static Reference getReference03() throws NoSuchAlgorithmException,null);
List<Transform> transforms = new ArrayList<Transform>();
transforms.add(getTransform(TRANSFORM_01));
return XML_SIGNATURE_FACTORY.newReference(null,null);
// return XML_SIGNATURE_FACTORY.newReference("",null);
}
// 獲取所有的(Reference);
public static List<Reference> getAllReference()
throws NoSuchAlgorithmException,InvalidAlgorithmParameterException {
List<Reference> list = new ArrayList<>();
list.add(getReference01());
list.add(getReference02());
list.add(getReference03());
return list;
}
// 獲取signInfo
public static SignedInfo getSignedInfo(List<Reference> ref)
throws NoSuchAlgorithmException,InvalidAlgorithmParameterException {
CanonicalizationMethod method = XML_SIGNATURE_FACTORY
.newCanonicalizationMethod(CanonicalizationMethod.EXCLUSIVE,(C14NMethodParameterSpec) null);
SignatureMethod signatureMethod = XML_SIGNATURE_FACTORY.newSignatureMethod(RSA_SHA256,null);
return XML_SIGNATURE_FACTORY.newSignedInfo(method,signatureMethod,ref);
}
public static X509Certificate getJetcoCertificateCrt() {
String crtUrl = MyProperties.getValue("component.x.certificate.url.crt");
InputStream is = null;
try {
is = new FileInputStream(new File(crtUrl));
CertificateFactory cf = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate) cf.generateCertificate(is);
return cert;
} catch (Exception e) {
e.printstacktrace();
}
return null;
}
/**
* 獲取公鑰
*
* @return
*/
public static PublicKey getPublicKeyByCert() {
return getJetcoCertificateCrt().getPublicKey();
}
public static PrivateKey getPrivateKey(){
String folderPath = MyProperties.getValue("component.a.sign.url.privateKey");
String keyType = MyProperties.getValue("component.a.sign.url.privateKey.keyType");
String keyAlias = MyProperties.getValue("component.a.sign.url.privateKey.alias");
String keyPwd = MyProperties.getValue("component.a.sign.url.privateKey.password");
FileInputStream fis = null;
try {
fis = new FileInputStream(folderPath);
KeyStore keyStore = KeyStore.getInstance(keyType);
keyStore.load(fis,keyPwd.tochararray());
PrivateKey pk = (PrivateKey) keyStore.getKey(keyAlias,keyPwd.tochararray());
fis.close();
return pk;
} catch (Exception e) {
e.printstacktrace();
return null;
}finally {
try {
if(fis !=null){
fis.close();
}
} catch (Exception e2) {
}
}
}
// 獲取keyInfo
/**
* <KeyInfo Id="keyInfoId"> <X509Data>
* <X509Certificate>...</X509Certificate> </X509Data> </KeyInfo>
*
* @return
* @throws CertificateException
*/
public static KeyInfo getKeyInfo() throws CertificateException {
KeyInfoFactory factory = KeyInfoFactory.getInstance("DOM");
X509Data x509Data = factory.newX509Data(Collections.singletonList(getJetcoCertificateCrt()));
// X509Data x509Data = factory.newX509Data(Collections.singletonList(getJetcoCertificateCrtWithBase64str()));
KeyInfo keyInfo = factory.newKeyInfo(Collections.singletonList(x509Data),KEY_INFO_ID);
return keyInfo;
}
public static Document getW3cDoc() {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = null;
try {
builder = factory.newDocumentBuilder();
Document doc = builder.parse(new InputSource(new StringReader(
"<MessagePayload><AppHdr xmlns=\"urn:iso:std:iso:20022:tech:xsd:head.001.001.01\"><CharSet>UTF-8</CharSet><Fr><OrgId><Nm>TFB</Nm></OrgId></Fr><To><OrgId><Nm>TFB</Nm></OrgId></To><BizMsgidr>JETCO-202026271000000685</BizMsgidr><MsgDefIdr>pacs.008.001.06</MsgDefIdr><CreDt>2020-08-27T17:26:03.372+0800</CreDt><Sgntr></Sgntr></AppHdr><Document xmlns=\"urn:iso:std:iso:20022:tech:xsd:pacs.008.001.06\"><FIToFICstmrCdtTrf><GrpHdr><Msgid>TFB2020-08-271000000685</Msgid><CreDtTm>2020-08-27T17:26:03</CreDtTm><NbOfTxs>1</NbOfTxs><SttlmInf><SttlmMtd>CLRG</SttlmMtd></SttlmInf><InstgAgt><FinInstnId><Othr><Id>9002</Id></Othr></FinInstnId></InstgAgt><InstdAgt><FinInstnId><Othr><Id>JP2M</Id></Othr></FinInstnId></InstdAgt></GrpHdr><CdtTrftxInf><PmtId><EndToEndId>2020082717260310667</EndToEndId><TxId>2020082717260310667</TxId></PmtId><PmtTpInf><CtgyPurp><Prtry>4</Prtry></CtgyPurp></PmtTpInf><IntrBkSttlmAmt Ccy=\"HKD\">100</IntrBkSttlmAmt><AccptncDtTm>2020-08-27T17:26:03</AccptncDtTm><ChrgBr>SLEV</ChrgBr><Dbtr/><DbtrAcct><Id><Othr><Id>00000020520488472</Id><SchmeNm><Prtry>ACCNO</Prtry></SchmeNm></Othr></Id><Tp><Prtry>SA</Prtry></Tp><Ccy>MOP</Ccy></DbtrAcct><DbtrAgt><FinInstnId/></DbtrAgt><CdtrAgt><FinInstnId><Othr><Id>hk.com.o.3</Id><SchmeNm><Prtry>ACQID</Prtry></SchmeNm></Othr></FinInstnId></CdtrAgt><Cdtr><Nm>TAI FUNG BANK LIMITED</Nm><Id><OrgId><Othr><Id>00009002</Id><SchmeNm><Prtry>MERID</Prtry></SchmeNm></Othr></OrgId></Id></Cdtr></CdtTrftxInf><SplmtryData><Envlp><Cnts><TxnInfo>MDAwMjAxMDEwMjEyMzI5NjAwMTRoay5jb20uamV0Y28uMTAxNzQwMDAwOTAwMiAgICAgICAgICAgMDAwMDAwNTEyMDQxMTk0MTkwMDcxNTQ0NjEyMzExNTE0NDkxOTQxOTA5MDAyODE4MU40NjAxMTMzODUwMDE0aGsuY29tLmpldGNvLjIwMTYzMDk5MDIwMDAwMDAwMDAwNDQ2MDAwMDEwMDk5MzQ0MDAwMDUwMDk5MzQ0MDAwMDEwMDk5MTU2MDAwMDEwMDk5MzQ5NzAwMTRoay5jb20uamV0Y28uMzAxMTUwMDAwOTAwMiAgICAgICAwMjMwVEFJIEZVTkcgQkFOSyBMSU1JVEVEICAgICAgICAgMDMxnu1hY2F1ICAgICAgICAgIDA0MDMwMDAzNTc1MDAxNGhrLmNvbS5qZXRjby40MDExNzIwMjAwNzE1MTUxNjA0MDAwMDIzMmZkNjExZGU4NDcyYjVjM2Q1MzUxY2Y3ZTBiMWE5MGMzNTIwNDYwMTE1MzAzMDAwNTQxMjAwMDAwMDAwMDAwMDU4MDJNTzU5MDQ5MDAyNjAxnu1hY2F1ICAgICAgICAgIDYzMDRDNjA3</TxnInfo><InvoiceNo></InvoiceNo><ARFlag>A</ARFlag></Cnts></Envlp></SplmtryData></FIToFICstmrCdtTrf></Document></MessagePayload>" //me
)));
System.out.println(doc);
return doc;
} catch (ParserConfigurationException e) {
e.printstacktrace();
} catch (SAXException e) {
e.printstacktrace();
} catch (IOException e) {
e.printstacktrace();
}
return null;
}
public static String sign(Document w3cDoc,PrivateKey privateKey,SignedInfo si,KeyInfo keyInfo)
throws TransformerConfigurationException,TransformerException,MarshalException,XMLSignatureException {
//第一个参数是签名用的私钥,第二个参数是指定承载签名节点
DOMSignContext dsc = new DOMSignContext(privateKey,w3cDoc.getElementsByTagName("Sgntr").item(0));
System.out.println(dsc);
XMLSignature signature = XML_SIGNATURE_FACTORY.newXMLSignature(si,keyInfo);
signature.sign(dsc);
StringWriter strWriter = new StringWriter();
TRANSFORMER_FACTORY.newTransformer().transform(new DOMSource(w3cDoc),new StreamResult(strWriter));
return strWriter.toString();
}
public static boolean checkSign(Node signNode,PublicKey publicKey) throws MarshalException,XMLSignatureException {
Optional.ofNullable(signNode.getPrevIoUsSibling()).ifPresent(e -> ((Element) e).setIdAttribute("id",true));
DOMValidateContext valContext = new DOMValidateContext(publicKey,signNode);
XMLSignature signature = XML_SIGNATURE_FACTORY.unmarshalXMLSignature(valContext);
return signature.validate(valContext);
}
public static org.w3c.dom.Document convert(org.dom4j.Document doc) throws DocumentException {
System.out.println("org.dom4j.Document,outXml:\n" + doc.asXML());
return new DOMWriter().write(doc);
}
public static org.dom4j.Document parse(org.w3c.dom.Document doc) throws Exception {
if (doc == null) {
return (null);
}
org.dom4j.io.Domreader xmlReader = new org.dom4j.io.Domreader();
return (xmlReader.read(doc));
}
public static void main(String[] args) {
try {
Document w3cDoc = getW3cDoc();
PrivateKey privateKey = getPrivateKey();
SignedInfo signedInfo = getSignedInfo(getAllReference());
KeyInfo keyInfo = getKeyInfo();
String sign = sign(w3cDoc,privateKey,signedInfo,keyInfo);
System.out.println(sign);
} catch (Exception e) {
e.printstacktrace();
}
}
}
但是它至少不能创建<Reference>
,并且结果也是错误的。
我的代码中有错误吗?还有其他创建ISO20022签名的方法吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)