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
(C) HTTP request for a SOAP web service using WS-Security 1.0 with a digital certificate for authenticationSee more HTTP ExamplesDemonstrates how to build and send an HTTP request for a SOAP web service using WS-Security 1.0 with a digital certificate for authentication.
#include <C_CkCert.h> #include <C_CkXml.h> #include <C_CkXmlDSigGen.h> #include <C_CkStringBuilder.h> #include <C_CkHttp.h> #include <C_CkHttpResponse.h> void ChilkatSample(void) { HCkCert cert; BOOL success; HCkXml xml; HCkXmlDSigGen gen; HCkXml xmlCustomKeyInfo; HCkStringBuilder sbXml; HCkHttp http; HCkHttpResponse resp; // This example assumes the Chilkat API to have been previously unlocked. // See Global Unlock Sample for sample code. // See HTTP request for a SOAP web service using WS-Security 1.0 with a digital certificate for authentication // ------------------------------------ // Step 1: Load the signing certificate // ------------------------------------ cert = CkCert_Create(); success = CkCert_LoadFromSmartcard(cert,""); if (success == FALSE) { printf("%s\n",CkCert_lastErrorText(cert)); CkCert_Dispose(cert); return; } // --------------------------------------- // Step 2: Build the SOAP XML to be signed // --------------------------------------- xml = CkXml_Create(); CkXml_putTag(xml,"SOAP-ENV:Envelope"); CkXml_AddAttribute(xml,"xmlns:SOAP-ENV","http://schemas.xmlsoap.org/soap/envelope/"); CkXml_AddAttribute(xml,"xmlns:web","http://www.example.com/webservice/"); CkXml_UpdateAttrAt(xml,"SOAP-ENV:Header|wsse:Security",TRUE,"xmlns:ds","http://www.w3.org/2000/09/xmldsig#"); CkXml_UpdateAttrAt(xml,"SOAP-ENV:Header|wsse:Security",TRUE,"xmlns:wsse","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"); CkXml_UpdateAttrAt(xml,"SOAP-ENV:Header|wsse:Security",TRUE,"xmlns:wsu","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"); CkXml_UpdateAttrAt(xml,"SOAP-ENV:Header|wsse:Security",TRUE,"xmlns:xenc","http://www.w3.org/2001/04/xmlenc#"); CkXml_UpdateAttrAt(xml,"SOAP-ENV:Header|wsse:Security",TRUE,"SOAP-ENV:mustUnderstand","1"); CkXml_UpdateAttrAt(xml,"SOAP-ENV:Header|wsse:Security|wsse:BinarySecurityToken",TRUE,"A1",""); CkXml_UpdateAttrAt(xml,"SOAP-ENV:Header|wsse:Security|wsse:BinarySecurityToken",TRUE,"EncodingType","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary"); CkXml_UpdateAttrAt(xml,"SOAP-ENV:Header|wsse:Security|wsse:BinarySecurityToken",TRUE,"ValueType","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509"); CkXml_UpdateAttrAt(xml,"SOAP-ENV:Header|wsse:Security|wsse:BinarySecurityToken",TRUE,"wsu:Id","x509cert00"); CkXml_UpdateChildContent(xml,"SOAP-ENV:Header|wsse:Security|wsse:BinarySecurityToken",CkCert_getEncoded(cert)); CkXml_UpdateAttrAt(xml,"SOAP-ENV:Body",TRUE,"xmlns:wsu","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"); CkXml_UpdateAttrAt(xml,"SOAP-ENV:Body",TRUE,"wsu:Id","TheBody"); CkXml_UpdateChildContent(xml,"SOAP-ENV:Body|web:MyRequest|web:Parameter","MyValue"); // --------------------------------------- // Step 3: Sign the XML // --------------------------------------- gen = CkXmlDSigGen_Create(); CkXmlDSigGen_putSigLocation(gen,"SOAP-ENV:Envelope|SOAP-ENV:Header|wsse:Security"); CkXmlDSigGen_putSigLocationMod(gen,0); CkXmlDSigGen_putSigNamespacePrefix(gen,"ds"); CkXmlDSigGen_putSigNamespaceUri(gen,"http://www.w3.org/2000/09/xmldsig#"); CkXmlDSigGen_putSignedInfoPrefixList(gen,"ds wsu xenc SOAP-ENV "); CkXmlDSigGen_putIncNamespacePrefix(gen,"c14n"); CkXmlDSigGen_putIncNamespaceUri(gen,"http://www.w3.org/2001/10/xml-exc-c14n#"); CkXmlDSigGen_putSignedInfoCanonAlg(gen,"EXCL_C14N"); CkXmlDSigGen_putSignedInfoDigestMethod(gen,"sha1"); // -------- Reference 1 -------- CkXmlDSigGen_AddSameDocRef(gen,"TheBody","sha1","EXCL_C14N","wsu SOAP-ENV",""); CkXmlDSigGen_SetX509Cert(gen,cert,TRUE); CkXmlDSigGen_putKeyInfoType(gen,"Custom"); // Create the custom KeyInfo XML.. xmlCustomKeyInfo = CkXml_Create(); CkXml_putTag(xmlCustomKeyInfo,"wsse:SecurityTokenReference"); CkXml_putContent(xmlCustomKeyInfo,"5"); CkXml_UpdateAttrAt(xmlCustomKeyInfo,"wsse:Reference",TRUE,"URI","#x509cert00"); CkXml_UpdateAttrAt(xmlCustomKeyInfo,"wsse:Reference",TRUE,"ValueType","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509"); CkXml_putEmitXmlDecl(xmlCustomKeyInfo,FALSE); CkXmlDSigGen_putCustomKeyInfoXml(gen,CkXml_getXml(xmlCustomKeyInfo)); // Load XML to be signed... sbXml = CkStringBuilder_Create(); CkXml_putEmitXmlDecl(xml,FALSE); CkXml_GetXmlSb(xml,sbXml); CkXmlDSigGen_putBehaviors(gen,"IndentedSignature"); // Sign the XML... success = CkXmlDSigGen_CreateXmlDSigSb(gen,sbXml); if (success != TRUE) { printf("%s\n",CkXmlDSigGen_lastErrorText(gen)); CkCert_Dispose(cert); CkXml_Dispose(xml); CkXmlDSigGen_Dispose(gen); CkXml_Dispose(xmlCustomKeyInfo); CkStringBuilder_Dispose(sbXml); return; } // --------------------------------------------------------- // Step 4: Send the HTTP POST containing the Signed SOAP XML // --------------------------------------------------------- http = CkHttp_Create(); CkHttp_SetRequestHeader(http,"SOAPAction","\"http://www.example.com/MyWebService\""); CkHttp_SetRequestHeader(http,"Host","www.example.com"); CkHttp_SetRequestHeader(http,"Content-Type","text/xml; charset=utf-8"); resp = CkHttp_PTextSb(http,"POST","https://example.com/MyWebService",sbXml,"utf-8","text/xml; charset=utf-8",FALSE,FALSE); if (CkHttp_getLastMethodSuccess(http) == FALSE) { printf("%s\n",CkHttp_lastErrorText(http)); CkCert_Dispose(cert); CkXml_Dispose(xml); CkXmlDSigGen_Dispose(gen); CkXml_Dispose(xmlCustomKeyInfo); CkStringBuilder_Dispose(sbXml); CkHttp_Dispose(http); return; } printf("%d\n",CkHttpResponse_getStatusCode(resp)); printf("%s\n",CkHttpResponse_bodyStr(resp)); CkHttpResponse_Dispose(resp); printf("Finished.\n"); CkCert_Dispose(cert); CkXml_Dispose(xml); CkXmlDSigGen_Dispose(gen); CkXml_Dispose(xmlCustomKeyInfo); CkStringBuilder_Dispose(sbXml); CkHttp_Dispose(http); } |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.