Xbase++ Requires Chilkat v11.0.0+
Xbase++
Belgium eHealth Platform - checkAccessControl
See more Belgian eHealth Platform Examples
Demonstrates the checkAccessControl operation of PlatformIntegrationConsumerTest, which requires an X.509 certificate and signature. This tests the validity of your certificate and signature.Chilkat Xbase++ Downloads
LOCAL nSuccess
LOCAL oCert
LOCAL oXmlToSign
LOCAL oBdCert
LOCAL oDt
LOCAL oGen
LOCAL oXmlCustomKeyInfo
LOCAL oSbXml
LOCAL oHttp
LOCAL oResp
nSuccess := 0
// This example assumes the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
// Provide a certificate + private key.
// Note: If your certificate + private key is located on a hardware token or smartcard, you can call a different function to load from smartcard..
oCert := CreateObject("Chilkat.Cert")
nSuccess := oCert:LoadPfxFile("SSIN=12345678.acc.p12", "p12_password")
IF (nSuccess == 0)
? oCert:LastErrorText
oCert:destroy()
RETURN
ENDIF
// Create the XML to be signed...
oXmlToSign := CreateObject("Chilkat.Xml")
oXmlToSign:Tag := "soapenv:Envelope"
oXmlToSign:AddAttribute("xmlns:soapenv", "http://schemas.xmlsoap.org/soap/envelope/")
oXmlToSign:AddAttribute("xmlns:urn", "urn:be:fgov:ehealth:platformintegrationconsumertest:v1")
oXmlToSign:AddAttribute("xmlns:urn1", "urn:be:fgov:ehealth:platformintegrationconsumertest:types:v1")
oXmlToSign:UpdateAttrAt("soapenv:Header|wsse:Security", 1, "xmlns:wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd")
oXmlToSign:UpdateAttrAt("soapenv:Header|wsse:Security", 1, "xmlns:wsu", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd")
oXmlToSign:UpdateAttrAt("soapenv:Header|wsse:Security|wsse:BinarySecurityToken", 1, "EncodingType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary")
oXmlToSign:UpdateAttrAt("soapenv:Header|wsse:Security|wsse:BinarySecurityToken", 1, "ValueType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3")
oXmlToSign:UpdateAttrAt("soapenv:Header|wsse:Security|wsse:BinarySecurityToken", 1, "wsu:Id", "X509-FC77E2C72083DA8E0F16711753508182856")
// ---------------------------------------------------------------------------------------------------------------
// A note about the Id's, such as X509-FC77E2C72083DA8E0F16711753508182856, TS-FC77E2C72083DA8E0F16711753508042855, etc.
// These Id's simply need to be unique within the XML document. You don't need to generate new Id's every time.
// You can use the same Id's in each XML document that is submitted. The purpose of each Id is to
// match the XMLDsig Reference to the element in XML being referenced.
// In other words, you could use the Id's "mickey_mouse", "donald_duck", and "goofy", and it would work perfectly OK,
// as long as no other XML elements also use the Id's "mickey_mouse", "donald_duck", or "goofy"
// ---------------------------------------------------------------------------------------------------------------
oBdCert := CreateObject("Chilkat.BinData")
oCert:ExportCertDerBd(oBdCert)
oXmlToSign:UpdateChildContent("soapenv:Header|wsse:Security|wsse:BinarySecurityToken", oBdCert:GetEncoded("base64"))
oXmlToSign:UpdateAttrAt("soapenv:Header|wsse:Security|wsu:Timestamp", 1, "wsu:Id", "TS-FC77E2C72083DA8E0F16711753508042855")
oDt := CreateObject("Chilkat.CkDateTime")
oDt:SetFromCurrentSystemTime()
oXmlToSign:UpdateChildContent("soapenv:Header|wsse:Security|wsu:Timestamp|wsu:Created", oDt:GetAsTimestamp(0))
oDt:AddSeconds(3600)
oXmlToSign:UpdateChildContent("soapenv:Header|wsse:Security|wsu:Timestamp|wsu:Expires", oDt:GetAsTimestamp(0))
oDt:AddSeconds(-3600)
oXmlToSign:UpdateAttrAt("soapenv:Body", 1, "wsu:Id", "id-FC77E2C72083DA8E0F16711753508182859")
oXmlToSign:UpdateAttrAt("soapenv:Body", 1, "xmlns:wsu", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd")
oXmlToSign:UpdateChildContent("soapenv:Body|urn:CheckAccessControlRequest|urn1:Message", "Hello World")
// Create a timestamp with the current date/time in the following format: 2014-12-30T15:29:03.157+01:00
oXmlToSign:UpdateChildContent("soapenv:Body|urn:CheckAccessControlRequest|urn1:Timestamp", oDt:GetAsTimestamp(1))
oGen := CreateObject("Chilkat.XmlDSigGen")
oGen:SigLocation := "soapenv:Envelope|soapenv:Header|wsse:Security|wsse:BinarySecurityToken"
oGen:SigLocationMod := 1
oGen:SigId := "SIG-FC77E2C72083DA8E0F16711753508252860"
oGen:SigNamespacePrefix := "ds"
oGen:SigNamespaceUri := "http://www.w3.org/2000/09/xmldsig#"
oGen:SignedInfoPrefixList := "soapenv urn urn1"
oGen:IncNamespacePrefix := "ec"
oGen:IncNamespaceUri := "http://www.w3.org/2001/10/xml-exc-c14n#"
oGen:SignedInfoCanonAlg := "EXCL_C14N"
oGen:SignedInfoDigestMethod := "sha256"
// Set the KeyInfoId before adding references..
oGen:KeyInfoId := "KI-FC77E2C72083DA8E0F16711753508182857"
// -------- Reference 1 --------
oGen:AddSameDocRef("TS-FC77E2C72083DA8E0F16711753508042855", "sha256", "EXCL_C14N", "wsse soapenv urn urn1", "")
// -------- Reference 2 --------
oGen:AddSameDocRef("id-FC77E2C72083DA8E0F16711753508182859", "sha256", "EXCL_C14N", "urn urn1", "")
// -------- Reference 3 --------
oGen:AddSameDocRef("X509-FC77E2C72083DA8E0F16711753508182856", "sha256", "EXCL_C14N", "_EMPTY_", "")
oGen:SetX509Cert(oCert, 1)
oGen:KeyInfoType := "Custom"
// Create the custom KeyInfo XML..
oXmlCustomKeyInfo := CreateObject("Chilkat.Xml")
oXmlCustomKeyInfo:Tag := "wsse:SecurityTokenReference"
oXmlCustomKeyInfo:AddAttribute("wsu:Id", "STR-FC77E2C72083DA8E0F16711753508182858")
oXmlCustomKeyInfo:UpdateAttrAt("wsse:Reference", 1, "URI", "#X509-FC77E2C72083DA8E0F16711753508182856")
oXmlCustomKeyInfo:UpdateAttrAt("wsse:Reference", 1, "ValueType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3")
oXmlCustomKeyInfo:EmitXmlDecl := 0
oGen:CustomKeyInfoXml := oXmlCustomKeyInfo:GetXml()
// Load XML to be signed...
oSbXml := CreateObject("Chilkat.StringBuilder")
oXmlToSign:GetXmlSb(oSbXml)
oGen:Behaviors := "IndentedSignature"
// Sign the XML...
nSuccess := oGen:CreateXmlDSigSb(oSbXml)
IF (nSuccess == 0)
? oGen:LastErrorText
oCert:destroy()
oXmlToSign:destroy()
oBdCert:destroy()
oDt:destroy()
oGen:destroy()
oXmlCustomKeyInfo:destroy()
oSbXml:destroy()
RETURN
ENDIF
// -----------------------------------------------
// Send the signed XML...
oHttp := CreateObject("Chilkat.Http")
nSuccess := oHttp:SetSslClientCert(oCert)
IF (nSuccess == 0)
? oHttp:LastErrorText
oCert:destroy()
oXmlToSign:destroy()
oBdCert:destroy()
oDt:destroy()
oGen:destroy()
oXmlCustomKeyInfo:destroy()
oSbXml:destroy()
oHttp:destroy()
RETURN
ENDIF
oHttp:SetRequestHeader("Content-Type", "text/xml")
// Change to services.ehealth.fgov.be for the production environment.
oResp := CreateObject("Chilkat.HttpResponse")
nSuccess := oHttp:HttpSb("POST", "https://services-acpt.ehealth.fgov.be/PlatformIntegrationConsumerTest/v1", oSbXml, "utf-8", "application/xml", oResp)
IF (nSuccess == 0)
? oHttp:LastErrorText
oCert:destroy()
oXmlToSign:destroy()
oBdCert:destroy()
oDt:destroy()
oGen:destroy()
oXmlCustomKeyInfo:destroy()
oSbXml:destroy()
oHttp:destroy()
oResp:destroy()
RETURN
ENDIF
? oResp:BodyStr
? "response status code = " + Str(oResp:StatusCode)
// A successful response is a 200 status code, with this sample response:
// <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
// <soapenv:Header xmlns:v1="urn:be:fgov:ehealth:platformintegrationconsumertest:v1" xmlns:v11="urn:be:fgov:ehealth:platformintegrationconsumertest:types:v1"/>
// <soapenv:Body xmlns:ic="urn:be:fgov:ehealth:platformintegrationconsumertest:v1" xmlns:type="urn:be:fgov:ehealth:platformintegrationconsumertest:types:v1">
// <ic:CheckAccessControlResponse>
// <type:Message>Hello World</type:Message>
// <type:Timestamp>2023-09-28T22:17:26.643+02:00</type:Timestamp>
// <type:AuthenticatedConsumer>CN="SSIN=aaaaaa", OU=eHealth-platform Belgium, OU=bbbb, OU="SSIN=aaaaaaa", O=Federal Government, C=BE</type:AuthenticatedConsumer>
// </ic:CheckAccessControlResponse>
// </soapenv:Body>
// </soapenv:Envelope>
oCert:destroy()
oXmlToSign:destroy()
oBdCert:destroy()
oDt:destroy()
oGen:destroy()
oXmlCustomKeyInfo:destroy()
oSbXml:destroy()
oHttp:destroy()
oResp:destroy()