OVERVIEW:

The code is about making call to the escreen web service using SOAP and Curl with client authentication required. Currently I am not getting any result only HTTP 403 and 500 errors.
The call requires client authenticate cert to be on the callng site.

CODE:

    $content = "<TicketRequest>
      <Version>1.0</Version>
      <Mode>Test</Mode>
      <CommitAction></CommitAction>
      <PartnerInfo>
      <UserName>xxxxxxxxxx</UserName>
      <Password>xxxxxxxxxxx</Password>
      </ PartnerInfo>
      <RequestorOrderID></RequestorOrderID>
      <CustomerIdentification>
        <IPAddress></IPAddress>
        <ClientAccount>xxxxxxxxxx</ClientAccount>
        <ClientSubAccount>xxxxxxxxxx</ClientSubAccount>
        <InternalAccount></InternalAccount>
        <ElectronicClientID></ElectronicClientID>
      </CustomerIdentification>
      <TicketAction>
        <Type></Type>
        <Params>
          <Param>
          <ID>4646</ID>
          <Value></Value>
          </Param>
        </Params>
      </TicketAction>
    </TicketRequest>";

$wsdl  = "https://services.escreen.com/SingleSignOnStage/SingleSignOn.asmx";

$headers = array(  "Content-type: text/xml;charset=\"utf-8\"", 
     "Accept: text/xml", 
     "Cache-Control: no-cache", 
     "Pragma: no-cache", 
  //   "SOAPAction: \"\"", 
     "Content-length: ".strlen($content),
    ); 


$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $wsdl); 
curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_VERBOSE, '1');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $content); 

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, '1');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, '1');
//curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: text/xml"));
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
//curl_setopt($ch, CURLOPT_HTTPHEADER, array('SOAPAction: ""')); 
curl_setopt($ch, CURLOPT_CAPATH, '/home/pps/');
curl_setopt($ch, CURLOPT_CAINFO,  '/home/pps/authority.pem');
curl_setopt($ch, CURLOPT_SSLCERT, 'PROTPLUSSOL_SSO.pem');
curl_setopt($ch, CURLOPT_SSLCERTPASSWD, 'xxxxxxxxxxxx');

$output = curl_exec($ch);

// Check if any error occured
if(curl_errno($ch))
{
    echo 'Error no : '.curl_errno($ch).' Curl error: ' . curl_error($ch);
}

print_r($output);

QUESTIONS:

  1. I need to call the RequestTicket method and pass the XML string to it.
    I don't know how to do it here(pass the method name to call).

  2. For client authentication they gave us three certs, one root cert, one intermediate
    cert and a client authentication cert PROTPLUSSOL_SSOpem(it was a .pfx file). Since we are on linux we converted them to pem . In curl calls I could not find way to how to include both the root cert and the intermediate cert ,so I combined them by making a new pem file and copying the intermediate cert and them the root cert and naming it authority.pem .
    I am not sure whether it works or not and would like your opinion.

  3. For the current code Iam getting the error
    Error no : 77 Curl error: error setting certificate verify locations: CAfile: /home/pps/authority.pem CApath: /home/pps/

If I disable the curl error message,I am getting blank page with page title 403 - Forbidden. Access is denied.

If I comment out the CURLOPT_CAPATH and CURLOPT_CAINFO lines it gives http 500 error page with the message as content and the following at the top.

HTTP/1.1 500 Internal Server Error. Cache-Control: private Content-Type: text/html Server: Microsoft-IIS/7.5 X-AspNet-Version: 1.1.4322 X-Powered-By: ASP.NET Date: Thu, 02 Sep 2010 14:46:38 GMT Content-Length: 1208

If I comment out as above and also CURLOPT_SSLCERT and CURLOPT_SSLCERTPASSWD it gives 403 error with the message as content.

So I would request you to help me out by pointing out whats wrong with the current code.

Thank you.

    I've never tried to do this, but the first thing I'd try is setting the file for CAINFO, and the path for CAPTH, rather than setting the path for CAPATH and the path and file for CAINFO

    curl_setopt($ch, CURLOPT_CAPATH, '/home/pps/');
    curl_setopt($ch, CURLOPT_CAINFO,  'authority.pem');
    

    Otherwise, curl ought to try this as certificate

    /home/pss//home/pss/authority.pem

    And that should give a file not found. At least on some systems it would.

      Hi johanafm,

      thank you for the lead ,I will try this out and post the outcome back on the forum.

        Write a Reply...