|  | 
Chilkat  HOME  Android™  AutoIt  C  C#  C++  Chilkat2-Python  CkPython  Classic ASP  DataFlex  Delphi DLL  Go  Java  Node.js  Objective-C  PHP Extension  Perl  PowerBuilder  PowerShell  PureBasic  Ruby  SQL Server  Swift  Tcl  Unicode C  Unicode C++  VB.NET  VBScript  Visual Basic 6.0  Visual FoxPro  Xojo Plugin
| (Classic ASP) Apply 2nd Signature to sii.cl Factura Electrónica (Chile Servicio de Impuestos Internos)Demonstrates how to apply the 2nd signature an XML invoice according to Chilean Internal Revenue Service regulations. 
 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> </head> <body> <% ' This example assumes the Chilkat API to have been previously unlocked. ' See Global Unlock Sample for sample code. ' In this example: Create sii.cl Factura Electr�nica (Chile Servicio de Impuestos Internos) ' We signed XML structured like this: ' <?xml version="1.0" encoding="iso-8859-1"?> ' <DTE version="1.0" xmlns="http://www.sii.cl/SiiDte"> ' <Documento ID="F11T22"> ' ... ' </Documento> ' </DTE> ' To get a signature like this: ' <?xml version="1.0" encoding="iso-8859-1"?> ' <DTE version="1.0" xmlns="http://www.sii.cl/SiiDte"> ' <Documento ID="F11T22"> ' ... ' </Documento> ' <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> ' .. ' </Signature> ' </DTE> ' Now we wish to wrap the result of the 1st example in the following and sign again: ' <?xml version="1.0" encoding="iso-8859-1"?> ' <EnvioDTE version="1.0" 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"> ' <SetDTE ID="NDTECHILE"> ' <Caratula version="1.0"> ' <RutEmisor>...</RutEmisor> ' <RutEnvia>...</RutEnvia> ' <RutReceptor>...</RutReceptor> ' <FchResol>2014-08-22</FchResol> ' <NroResol>80</NroResol> ' <TmstFirmaEnv>2020-07-17T13:19:10</TmstFirmaEnv> ' <SubTotDTE> ' <TpoDTE>34</TpoDTE> ' <NroDTE>1</NroDTE> ' </SubTotDTE> ' </Caratula> ' <DTE version="1.0" xmlns="http://www.sii.cl/SiiDte"> ' <Documento ID="F11T22">...</Documento> ' <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">..</Signature> ' </DTE> ' </SetDTE> ' </EnvioDTE> ' The result will be this: ' <?xml version="1.0" encoding="iso-8859-1"?> ' <EnvioDTE version="1.0" 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"> ' <SetDTE ID="NDTECHILE"> ' <Caratula version="1.0"> ' <RutEmisor>...</RutEmisor> ' <RutEnvia>...</RutEnvia> ' <RutReceptor>...</RutReceptor> ' <FchResol>2014-08-22</FchResol> ' <NroResol>80</NroResol> ' <TmstFirmaEnv>2020-07-17T13:19:10</TmstFirmaEnv> ' <SubTotDTE> ' <TpoDTE>34</TpoDTE> ' <NroDTE>1</NroDTE> ' </SubTotDTE> ' </Caratula> ' <DTE version="1.0" xmlns="http://www.sii.cl/SiiDte"> ' <Documento ID="F11T22">...</Documento> ' <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">..</Signature> ' </DTE> ' </SetDTE> ' <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">..</Signature> ' </EnvioDTE> ' For versions of Chilkat < 10.0.0, use CreateObject("Chilkat_9_5_0.XmlDSigGen") set gen = Server.CreateObject("Chilkat.XmlDSigGen") gen.SigLocation = "EnvioDTE" gen.SigLocationMod = 0 gen.SigNamespacePrefix = "" gen.SigNamespaceUri = "http://www.w3.org/2000/09/xmldsig#" gen.SignedInfoCanonAlg = "C14N" gen.SignedInfoDigestMethod = "sha1" ' -------- Reference 1 -------- success = gen.AddSameDocRef("NDTECHILE","sha1","","","") ' Provide a certificate + private key. (PFX password is test123) ' For versions of Chilkat < 10.0.0, use CreateObject("Chilkat_9_5_0.Cert") set cert = Server.CreateObject("Chilkat.Cert") success = cert.LoadPfxFile("qa_data/pfx/cert_test123.pfx","test123") If (success <> 1) Then Response.Write "<pre>" & Server.HTMLEncode( cert.LastErrorText) & "</pre>" Response.End End If success = gen.SetX509Cert(cert,1) gen.KeyInfoType = "X509Data+KeyValue" gen.X509Type = "Certificate" ' Here's the part where we must be very careful not to disturb the existing signature. ' We want to encapsulate the existing signed XML like this: ' <?xml version="1.0" encoding="iso-8859-1"?> ' <EnvioDTE version="1.0" 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"> ' <SetDTE ID="NDTECHILE"> ' <Caratula version="1.0"> ' <RutEmisor>...</RutEmisor> ' <RutEnvia>...</RutEnvia> ' <RutReceptor>...</RutReceptor> ' <FchResol>2014-08-22</FchResol> ' <NroResol>80</NroResol> ' <TmstFirmaEnv>2020-07-17T13:19:10</TmstFirmaEnv> ' <SubTotDTE> ' <TpoDTE>34</TpoDTE> ' <NroDTE>1</NroDTE> ' </SubTotDTE> ' </Caratula> ' <EXISTING_SIGNED_XML>HERE</EXISTING_SIGNED_XML> ' </SetDTE> ' <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">..</Signature> ' </EnvioDTE> ' For versions of Chilkat < 10.0.0, use CreateObject("Chilkat_9_5_0.Xml") set xml = Server.CreateObject("Chilkat.Xml") xml.Tag = "EnvioDTE" success = xml.AddAttribute("version","1.0") success = xml.AddAttribute("xmlns","http://www.sii.cl/SiiDte") success = xml.AddAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance") success = xml.AddAttribute("xsi:schemaLocation","http://www.sii.cl/SiiDte EnvioDTE_v10.xsd") success = xml.UpdateAttrAt("SetDTE",1,"ID","NDTECHILE") success = xml.UpdateAttrAt("SetDTE|Caratula",1,"version","1.0") xml.UpdateChildContent "SetDTE|Caratula|RutEmisor","..." xml.UpdateChildContent "SetDTE|Caratula|RutEnvia","..." xml.UpdateChildContent "SetDTE|Caratula|RutReceptor","..." xml.UpdateChildContent "SetDTE|Caratula|FchResol","2014-08-22" xml.UpdateChildContent "SetDTE|Caratula|NroResol","80" xml.UpdateChildContent "SetDTE|Caratula|TmstFirmaEnv","2020-07-17T13:19:10" xml.UpdateChildContent "SetDTE|Caratula|SubTotDTE|TpoDTE","34" xml.UpdateChildContent "SetDTE|Caratula|SubTotDTE|NroDTE","1" xml.UpdateChildContent "SetDTE|EXISTING_SIGNED_XML","HERE" ' For versions of Chilkat < 10.0.0, use CreateObject("Chilkat_9_5_0.StringBuilder") set sbXml = Server.CreateObject("Chilkat.StringBuilder") success = xml.GetXmlSb(sbXml) ' Load our existing signed XML. ' We cannot load it into a Chilkat XML object because we cannot allow anything to change, ' not even indentation or whitespace. ' For versions of Chilkat < 10.0.0, use CreateObject("Chilkat_9_5_0.StringBuilder") set sbExisting = Server.CreateObject("Chilkat.StringBuilder") success = sbExisting.LoadFile("qa_data/xml_dsig/sii_cl/signed1.xml","iso-8859-1") ' However, we must remove the XML declarator, and we can trim the whitespace at the very front and back (i.e. whitespace completely outside the document). numReplaced = sbExisting.Replace("<?xml version=""1.0"" encoding=""iso-8859-1""?>","") success = sbExisting.Trim() ' Insert the existing signed XML into the new XML document to be signed. numReplaced = sbXml.Replace("<EXISTING_SIGNED_XML>HERE</EXISTING_SIGNED_XML>",sbExisting.GetAsString()) ' We now have the XML document ready for the 2nd signature to be applied... ' Make sure we add the "SignExistingSignatures" behavior so that this signature includes the original signature in the digest. gen.Behaviors = "IndentedSignature,SignExistingSignatures" ' Sign the XML... success = gen.CreateXmlDSigSb(sbXml) If (success <> 1) Then Response.Write "<pre>" & Server.HTMLEncode( gen.LastErrorText) & "</pre>" Response.End End If ' ----------------------------------------------- ' Change the XML declarator to indicate iso-8859-1 (because we'll be saving using iso-8859-1) numReplaced = sbXml.Replace("encoding=""utf-8""?>","encoding=""iso-8859-1""?>") ' Save the signed XML to a file. success = sbXml.WriteFile("qa_data/xml_dsig/sii_cl/signed2.xml","iso-8859-1",0) Response.Write "<pre>" & Server.HTMLEncode( sbXml.GetAsString()) & "</pre>" %> </body> </html> | ||||
© 2000-2025 Chilkat Software, Inc. All Rights Reserved.