Visual Basic 6.0
Visual Basic 6.0
Sign SOAP XML for New Zealand Customs Service
See more XAdES Examples
Demonstrates how to create an XAdES signed SOAP XML pertaining to the New Zealand Customs Service.Note: This example requires Chilkat v9.5.0.96 or later.
Chilkat Visual Basic 6.0 Downloads
Dim success As Long
success = 0
' This example assumes the Chilkat API to have been previously unlocked.
' See Global Unlock Sample for sample code.
success = 1
' Create the following XML to be signed:
' <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
' xmlns:v1="http://customs.govt.nz/jbms/msggate/reqresp/v1">
' <soapenv:Header>
' <wsse:Security soapenv:mustUnderstand="1"
' xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
' xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
' <wsu:Timestamp wsu:Id="TS-037E78514E9B9132CB16817563559151">
' <wsu:Created>2023-04-17T18:32:35.913Z</wsu:Created>
' <wsu:Expires>2023-04-17T19:32:35.913Z</wsu:Expires>
' </wsu:Timestamp>
' </wsse:Security>
' </soapenv:Header>
' <soapenv:Body wsu:Id="id-8"
' xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
' <v1:RequestResponse>
' <v1:Submitter>TEST1234</v1:Submitter>
' <v1:MailboxMsgId>999999</v1:MailboxMsgId>
' </v1:RequestResponse>
' </soapenv:Body>
' </soapenv:Envelope>
' Create a random ID like this: TS-037E78514E9B9132CB16817563559151
Dim tsId As New ChilkatStringBuilder
success = tsId.Append("TS-")
success = tsId.AppendRandom(16,"hex")
' STR-037E78514E9B9132CB16817563559614
Dim strId As New ChilkatStringBuilder
success = strId.Append("STR-")
success = strId.AppendRandom(16,"hex")
' KI-037E78514E9B9132CB16817563559583
Dim keyInfoId As New ChilkatStringBuilder
success = keyInfoId.Append("KI-")
success = keyInfoId.AppendRandom(16,"hex")
' Create a date/time for the current time with this format: 2023-04-17T18:32:35.913Z
Dim dt As New CkDateTime
success = dt.SetFromCurrentSystemTime()
Dim sbNow As New ChilkatStringBuilder
success = sbNow.Append(dt.GetAsTimestamp(0))
' If we really need the milliseconds, we can replace the "Z" with ".000Z"
' The server will also likely accept a timestamp without milliseconds, such as 2023-04-17T18:32:35Z
Dim n As Long
n = sbNow.Replace("Z",".000Z")
Dim sbNowPlusOneHour As New ChilkatStringBuilder
success = dt.AddSeconds(3600)
success = sbNowPlusOneHour.Append(dt.GetAsTimestamp(0))
n = sbNowPlusOneHour.Replace("Z",".000Z")
Dim xmlToSign As New ChilkatXml
xmlToSign.Tag = "soapenv:Envelope"
success = xmlToSign.AddAttribute("xmlns:soapenv","http://schemas.xmlsoap.org/soap/envelope/")
success = xmlToSign.AddAttribute("xmlns:v1","http://customs.govt.nz/jbms/msggate/reqresp/v1")
success = xmlToSign.UpdateAttrAt("soapenv:Header|wsse:Security",1,"soapenv:mustUnderstand","1")
success = xmlToSign.UpdateAttrAt("soapenv:Header|wsse:Security",1,"xmlns:wsse","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd")
success = xmlToSign.UpdateAttrAt("soapenv:Header|wsse:Security",1,"xmlns:wsu","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd")
success = xmlToSign.UpdateAttrAt("soapenv:Header|wsse:Security|wsu:Timestamp",1,"wsu:Id",tsId.GetAsString())
xmlToSign.UpdateChildContent "soapenv:Header|wsse:Security|wsu:Timestamp|wsu:Created",sbNow.GetAsString()
xmlToSign.UpdateChildContent "soapenv:Header|wsse:Security|wsu:Timestamp|wsu:Expires",sbNowPlusOneHour.GetAsString()
success = xmlToSign.UpdateAttrAt("soapenv:Body",1,"wsu:Id","id-8")
success = xmlToSign.UpdateAttrAt("soapenv:Body",1,"xmlns:wsu","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd")
xmlToSign.UpdateChildContent "soapenv:Body|v1:RequestResponse|v1:Submitter","TEST1234"
xmlToSign.UpdateChildContent "soapenv:Body|v1:RequestResponse|v1:MailboxMsgId","999999"
Dim gen As New ChilkatXmlDSigGen
gen.SigLocation = "soapenv:Envelope|soapenv:Header|wsse:Security"
gen.SigLocationMod = 0
gen.SigId = "SIG-037E78514E9B9132CB16817563559695"
gen.SigNamespacePrefix = "ds"
gen.SigNamespaceUri = "http://www.w3.org/2000/09/xmldsig#"
gen.SignedInfoPrefixList = "soapenv v1"
gen.IncNamespacePrefix = "ec"
gen.IncNamespaceUri = "http://www.w3.org/2001/10/xml-exc-c14n#"
gen.SignedInfoCanonAlg = "EXCL_C14N"
gen.SignedInfoDigestMethod = "sha256"
' Set the KeyInfoId before adding references..
gen.KeyInfoId = keyInfoId.GetAsString()
' -------- Reference 1 --------
Dim xml1 As New ChilkatXml
xml1.Tag = "ds:Transforms"
success = xml1.UpdateAttrAt("ds:Transform",1,"Algorithm","http://www.w3.org/2001/10/xml-exc-c14n#")
success = xml1.UpdateAttrAt("ds:Transform|ec:InclusiveNamespaces",1,"PrefixList","wsse soapenv v1")
success = xml1.UpdateAttrAt("ds:Transform|ec:InclusiveNamespaces",1,"xmlns:ec","http://www.w3.org/2001/10/xml-exc-c14n#")
success = gen.AddSameDocRef2(tsId.GetAsString(),"sha256",xml1,"")
' -------- Reference 2 --------
Dim xml2 As New ChilkatXml
xml2.Tag = "ds:Transforms"
success = xml2.UpdateAttrAt("ds:Transform",1,"Algorithm","http://www.w3.org/2001/10/xml-exc-c14n#")
success = xml2.UpdateAttrAt("ds:Transform|ec:InclusiveNamespaces",1,"PrefixList","v1")
success = xml2.UpdateAttrAt("ds:Transform|ec:InclusiveNamespaces",1,"xmlns:ec","http://www.w3.org/2001/10/xml-exc-c14n#")
success = gen.AddSameDocRef2("id-8","sha256",xml2,"")
' Provide a certificate + private key. (PFX password is test123)
Dim cert As New ChilkatCert
success = cert.LoadPfxFile("qa_data/pfx/cert_test123.pfx","test123")
If (success <> 1) Then
Debug.Print cert.LastErrorText
Exit Sub
End If
success = gen.SetX509Cert(cert,1)
gen.KeyInfoType = "Custom"
' Create the custom KeyInfo XML..
Dim xmlCustomKeyInfo As New ChilkatXml
xmlCustomKeyInfo.Tag = "wsse:SecurityTokenReference"
success = xmlCustomKeyInfo.AddAttribute("wsu:Id",strId.GetAsString())
success = xmlCustomKeyInfo.UpdateAttrAt("wsse:KeyIdentifier",1,"EncodingType","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary")
success = xmlCustomKeyInfo.UpdateAttrAt("wsse:KeyIdentifier",1,"ValueType","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3")
' Insert the single-line base64 of the signing certificate's DER
cert.UncommonOptions = "Base64CertNoCRLF"
xmlCustomKeyInfo.UpdateChildContent "wsse:KeyIdentifier",cert.GetEncoded()
xmlCustomKeyInfo.EmitXmlDecl = 0
gen.CustomKeyInfoXml = xmlCustomKeyInfo.GetXml()
' Load XML to be signed...
Dim sbXml As New ChilkatStringBuilder
success = xmlToSign.GetXmlSb(sbXml)
gen.Behaviors = "IndentedSignature"
' Sign the XML...
gen.VerboseLogging = 1
success = gen.CreateXmlDSigSb(sbXml)
If (success <> 1) Then
Debug.Print gen.LastErrorText
Exit Sub
End If
' Save the signed XML to a file.
success = sbXml.WriteFile("c:/temp/qa_output/signedXml.xml","utf-8",0)
Debug.Print sbXml.GetAsString()