Sample code for 30+ languages & platforms
Java

SII XML Digital Signature

See more uncategorized Examples

Example for SII XML Digital Signature.

Chilkat Java Downloads

Chilkat2 Java
import com.chilkatsoft.chilkat2.Cert;
import com.chilkatsoft.chilkat2.ChilkatException;
import com.chilkatsoft.chilkat2.StringBuilder;
import com.chilkatsoft.chilkat2.Xml;
import com.chilkatsoft.chilkat2.XmlDSig;
import com.chilkatsoft.chilkat2.XmlDSigGen;

public class ChilkatExample {

    public static void main(String[] args) {
        boolean success = false;

        success = true;

        // Load the XML to be signed.
        Xml xmlToSign = new Xml();
        try {
            xmlToSign.loadXmlFile("c:/aaworkarea/eduardo/sii_unsigned.xml");
        } catch (ChilkatException e) {
            System.out.println(e.getLastErrorText());
            return;
        }

        // The sample XML to be signed looks like this:

        // <?xml version="1.0" encoding="ISO-8859-1"?>
        // <EnvioDTE xmlns="http://www.sii.cl/SiiDte" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sii.cl/SiiDte EnvioDTE_v10.xsd" version="1.0">
        // <SetDTE ID="SetDocF0T33_20240425_170512">
        //  <Caratula version="1.0">
        //   <RutEmisor>99999999-4</RutEmisor>
        //   <RutEnvia>12345678-6</RutEnvia>
        //   <RutReceptor>888888000-K</RutReceptor>
        //   <FchResol>2014-08-22</FchResol>
        //   <NroResol>80</NroResol>
        //   <TmstFirmaEnv>2024-04-25T17:05:13</TmstFirmaEnv>
        //   <SubTotDTE>
        //    <TpoDTE>33</TpoDTE>
        //    <NroDTE>1</NroDTE>
        //   </SubTotDTE>
        //  </Caratula>
        // <DTE version="1.0">
        // <Documento ID="F555T55">
        // ...
        // </Documento>
        // </EnvioDTE>

        XmlDSigGen gen = new XmlDSigGen();

        gen.setSigLocation("EnvioDTE|SetDTE|DTE");
        gen.setSigLocationMod(0);
        gen.setSigNamespacePrefix("");
        gen.setSigNamespaceUri("http://www.w3.org/2000/09/xmldsig#");
        gen.setSignedInfoCanonAlg("C14N");
        gen.setSignedInfoDigestMethod("sha1");

        // -------- Reference 1 --------
        Xml xml1 = new Xml();
        xml1.setTag("Transforms");
        xml1.updateAttrAt("Transform", true, "Algorithm", "http://www.w3.org/TR/2001/REC-xml-c14n-20010315");

        gen.addSameDocRef2("F511T33", "sha1", xml1, "");

        // Provide a certificate + private key. (PFX password is test123)
        Cert cert = new Cert();
        try {
            cert.loadPfxFile("qa_data/pfx/cert_test123.pfx", "test123");
        } catch (ChilkatException e) {
            System.out.println(e.getLastErrorText());
            return;
        }

        gen.setX509Cert(cert, true);

        gen.setKeyInfoType("X509Data+KeyValue");
        gen.setX509Type("Certificate");

        // Load XML to be signed...
        StringBuilder sbXml = new StringBuilder();
        xmlToSign.getXmlSb(sbXml);

        gen.setBehaviors("IndentedSignature");

        // Sign the XML...
        try {
            gen.createXmlDSigSb(sbXml);
        } catch (ChilkatException e) {
            System.out.println(e.getLastErrorText());
            return;
        }

        // -----------------------------------------------

        // Save the signed XML to a file.
        sbXml.writeFile("c:/temp/qa_output/signedXml.xml", "utf-8", false);

        System.out.println(sbXml.getAsString());

        // ----------------------------------------
        // Verify the signatures we just produced...
        XmlDSig verifier = new XmlDSig();
        try {
            verifier.loadSignatureSb(sbXml);
        } catch (ChilkatException e) {
            System.out.println(e.getLastErrorText());
            return;
        }

        int numSigs = verifier.getNumSignatures();
        int verifyIdx = 0;
        while (verifyIdx < numSigs) {
            verifier.setSelector(verifyIdx);
            try {
                verifier.verifySignature(true);
            } catch (ChilkatException e) {
                System.out.println(e.getLastErrorText());
                return;
            }

            verifyIdx = verifyIdx + 1;
        }

        System.out.println("All signatures were successfully verified.");
    }
}