Chilkat HOME .NET Core C# Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi ActiveX Delphi DLL Go Java Lianja Mono C# Node.js Objective-C PHP ActiveX PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(Visual FoxPro) Sign SOAP XML using a wsse:SecurityTokenReferenceThis example signs SOAP XML such that the KeyInfo in the XML Signature is a wsse:SecurityTokenReference to the X.509 certificate embedded elsewhere in the SOAP XML.
LOCAL loSbXml LOCAL loHttp LOCAL lnSuccess LOCAL loPfxData LOCAL loPfx LOCAL lcPassword LOCAL loCert LOCAL loBdCert LOCAL lnNumReplaced LOCAL loRefXml LOCAL loGen * This example requires the Chilkat API to have been previously unlocked. * See Global Unlock Sample for sample code. * To begin, we'll need a PFX containing a certificate and private key, and the SOAP XML to be signed. * Chilkat provides sample data at chilkatsoft.com and chilkatdownload.com, and our first step is to download. * ------------------------------------------------------------------------- * Step 1: Get the SOAP XML template to be signed. * * For versions of Chilkat < 10.0.0, use CreateObject('Chilkat_9_5_0.StringBuilder') loSbXml = CreateObject('Chilkat.StringBuilder') * For versions of Chilkat < 10.0.0, use CreateObject('Chilkat_9_5_0.Http') loHttp = CreateObject('Chilkat.Http') lnSuccess = loHttp.QuickGetSb("https://www.chilkatsoft.com/exampleData/wssSoapTemplate.xml",loSbXml) IF (lnSuccess <> 1) THEN ? loHttp.LastErrorText RELEASE loSbXml RELEASE loHttp CANCEL ENDIF * The SOAP XML template contains this: * <?xml version="1.0" encoding="UTF8"?> * <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> * <SOAP-ENV:Header> * <wsse:Security xmlns:ds="http://www.w3.org/2000/09/xmldsig#" * 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" * xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" SOAP-ENV:mustUnderstand="1"> * <wsse:BinarySecurityToken * EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" * ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509" * wsu:Id="x509cert00">BASE64_CERT</wsse:BinarySecurityToken> * </wsse:Security> * </SOAP-ENV:Header> * <SOAP-ENV:Body xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="TheBody"> * <getVersion xmlns="http://msgsec.wssecfvt.ws.ibm.com"/> * </SOAP-ENV:Body> * </SOAP-ENV:Envelope> * * ------------------------------------------------------------------------- * Step 2: Get the test certificate and private key stored in a .pfx * * For versions of Chilkat < 10.0.0, use CreateObject('Chilkat_9_5_0.BinData') loPfxData = CreateObject('Chilkat.BinData') lnSuccess = loHttp.QuickGetBd("http://chilkatdownload.com/example_data/testcertificate.pfx",loPfxData) IF (lnSuccess <> 1) THEN ? loHttp.LastErrorText RELEASE loSbXml RELEASE loHttp RELEASE loPfxData CANCEL ENDIF * For versions of Chilkat < 10.0.0, use CreateObject('Chilkat_9_5_0.Pfx') loPfx = CreateObject('Chilkat.Pfx') lcPassword = "test" lnSuccess = loPfx.LoadPfxEncoded(loPfxData.GetEncoded("base64"),"base64",lcPassword) IF (lnSuccess <> 1) THEN ? loPfx.LastErrorText RELEASE loSbXml RELEASE loHttp RELEASE loPfxData RELEASE loPfx CANCEL ENDIF * ------------------------------------------------------------------------- * Step 3: Get the certificate from the PFX. * loCert = loPfx.GetCert(0) IF (loPfx.LastMethodSuccess <> 1) THEN ? loPfx.LastErrorText RELEASE loSbXml RELEASE loHttp RELEASE loPfxData RELEASE loPfx CANCEL ENDIF * ------------------------------------------------------------------------- * Step 4: Replace "BASE64_CERT" with the actual base64 encoded certificate. * * For versions of Chilkat < 10.0.0, use CreateObject('Chilkat_9_5_0.BinData') loBdCert = CreateObject('Chilkat.BinData') loCert.ExportCertDerBd(loBdCert) lnNumReplaced = loSbXml.Replace("BASE64_CERT",loBdCert.GetEncoded("base64")) * ------------------------------------------------------------------------- * Step 5: Build the wsse:SecurityTokenReference XML. * This will be the CustomKeyInfoXml (see below). * * For versions of Chilkat < 10.0.0, use CreateObject('Chilkat_9_5_0.Xml') loRefXml = CreateObject('Chilkat.Xml') loRefXml.Tag = "wsse:SecurityTokenReference" loRefXml.UpdateAttrAt("wsse:Reference",1,"URI","#x509cert00") loRefXml.UpdateAttrAt("wsse:Reference",1,"ValueType","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509") * The above lines of code builds the following XML: * <wsse:SecurityTokenReference> * <wsse:Reference URI="#x509cert00" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509" /> * </wsse:SecurityTokenReference> * loRefXml.EmitXmlDecl = 0 ? loRefXml.GetXml() * ------------------------------------------------------------------------- * Step 6: Setup the XML Digital Signature Generator and add the XML Signature. * * For versions of Chilkat < 10.0.0, use CreateObject('Chilkat_9_5_0.XmlDSigGen') loGen = CreateObject('Chilkat.XmlDSigGen') loGen.SigLocation = "SOAP-ENV:Envelope|SOAP-ENV:Header|wsse:Security" loGen.SignedInfoPrefixList = "wsse SOAP-ENV" loGen.AddSameDocRef("TheBody","sha1","EXCL_C14N","","") loGen.KeyInfoType = "Custom" loRefXml.EmitCompact = 1 loGen.CustomKeyInfoXml = loRefXml.GetXml() loGen.SetX509Cert(loCert,1) RELEASE loCert lnSuccess = loGen.CreateXmlDSigSb(loSbXml) IF (lnSuccess <> 1) THEN ? loGen.LastErrorText RELEASE loSbXml RELEASE loHttp RELEASE loPfxData RELEASE loPfx RELEASE loBdCert RELEASE loRefXml RELEASE loGen CANCEL ENDIF * Examine the signed XML ? loSbXml.GetAsString() * Pretty-printed, the XML signature looks as shown here: * (The exact XML signature is shown below. Pretty-printing invalidates the XML signature.) * <?xml version="1.0" encoding="UTF8" ?> * <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> * <SOAP-ENV:Header> * <wsse:Security xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 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" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" SOAP-ENV:mustUnderstand="1"> * <wsse:BinarySecurityToken EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509" wsu:Id="x509cert00">MIID...</wsse:BinarySecurityToken> * <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> * <ds:SignedInfo> * <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"> * <InclusiveNamespaces xmlns="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="wsse SOAP-ENV" /> * </ds:CanonicalizationMethod> * <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" /> * <ds:Reference URI="#TheBody"> * <ds:Transforms> * <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> * </ds:Transforms> * <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> * <ds:DigestValue>VhsSnaEAFsY0OYegKQh99v9csXg=</ds:DigestValue> * </ds:Reference> * </ds:SignedInfo> * <ds:SignatureValue>Ynp3H4rtzpXIh4TaVxkpEkS1bMCCu672aeCzUOzheNNfnpmLsCZz3+zQjMBbchPggCayC5ihpEdhRe3XvPXjPXXAgxDP4mic091QPmjHlmUcu8yqRKfxnPtD35nqaxDtCYw+jGIzj+ch094vA4RPCfY8JQnb1mpy1ZjjsMW8741CIh1epbsd/0bZt6tfINUQ37seg07yvLbCJZ/Zf+h8FlFryQk6lHTTeZl/GfQ9NlDBcShby3x8Hc1KwW++zFqEA7G783R9AYPYn3fWTOBhYk5gkgFc+HaPRLR/L0Bp7ZPbmOR/iZQ+HK4W672tTdN/R2GdN7/deV7QTp2DYK1Z8w==</ds:SignatureValue> * <ds:KeyInfo> * <wsse:SecurityTokenReference> * <wsse:Reference URI="#x509cert00" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509" /> * </wsse:SecurityTokenReference> * </ds:KeyInfo> * </ds:Signature> * </wsse:Security> * </SOAP-ENV:Header> * <SOAP-ENV:Body xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="TheBody"> * <getVersion xmlns="http://msgsec.wssecfvt.ws.ibm.com" /> * </SOAP-ENV:Body> * </SOAP-ENV:Envelope> * * -------------------------------------------------------------------------------------------- * This is the XML signature, which is also available at https://www.chilkatsoft.com/exampleData/signedSoapBinarySecurityToken.xml * * <?xml version="1.0" encoding="UTF8"?> * <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> * <SOAP-ENV:Header> * <wsse:Security xmlns:ds="http://www.w3.org/2000/09/xmldsig#" * 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" * xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" SOAP-ENV:mustUnderstand="1"> * <wsse:BinarySecurityToken * EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" * ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509" * wsu:Id="x509cert00">MIIDg...</wsse:BinarySecurityToken> * <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"><ds:SignedInfo><ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"><InclusiveNamespaces xmlns="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="wsse SOAP-ENV"/></ds:CanonicalizationMethod><ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/><ds:Reference URI="#TheBody"><ds:Transforms><ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></ds:Transforms><ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/><ds:DigestValue>VhsSnaEAFsY0OYegKQh99v9csXg=</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>Ynp3H4rtzpXIh4TaVxkpEkS1bMCCu672aeCzUOzheNNfnpmLsCZz3+zQjMBbchPggCayC5ihpEdhRe3XvPXjPXXAgxDP4mic091QPmjHlmUcu8yqRKfxnPtD35nqaxDtCYw+jGIzj+ch094vA4RPCfY8JQnb1mpy1ZjjsMW8741CIh1epbsd/0bZt6tfINUQ37seg07yvLbCJZ/Zf+h8FlFryQk6lHTTeZl/GfQ9NlDBcShby3x8Hc1KwW++zFqEA7G783R9AYPYn3fWTOBhYk5gkgFc+HaPRLR/L0Bp7ZPbmOR/iZQ+HK4W672tTdN/R2GdN7/deV7QTp2DYK1Z8w==</ds:SignatureValue><ds:KeyInfo><wsse:SecurityTokenReference><wsse:Reference URI="#x509cert00" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509" /></wsse:SecurityTokenReference></ds:KeyInfo></ds:Signature></wsse:Security> * </SOAP-ENV:Header> * <SOAP-ENV:Body xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="TheBody"> * <getVersion xmlns="http://msgsec.wssecfvt.ws.ibm.com"/> * </SOAP-ENV:Body> * </SOAP-ENV:Envelope> * RELEASE loSbXml RELEASE loHttp RELEASE loPfxData RELEASE loPfx RELEASE loBdCert RELEASE loRefXml RELEASE loGen |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.