在三个参考文献中是否有针对带有XML签名的Java代码的解决方案?

问题描述

我正在尝试使用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 (将#修改为@)