2010-09-02 5 views
0

VUE D'ENSEMBLE:appel de méthode SOAP via CURL en PHP, appelez requièrent une authentification client

Le code consiste à faire appel au service Web SOAP et eScreen en utilisant Curl avec l'authentification client requis. Actuellement, je n'obtiens aucun résultat seulement les erreurs HTTP 403 et 500. L'appel nécessite que le client authentifie le certificat sur le site d'appel.

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. Je dois appeler la méthode RequestTicket et passer la chaîne XML à elle. Je ne sais pas comment le faire ici (passer le nom de la méthode à appeler). Pour l'authentification client, ils nous ont donné trois certificats, un certificat racine, un certificat intermédiaire et un certificat d'authentification client PROTPLUSSOL_SSOpem (il s'agissait d'un fichier .pfx). Puisque nous sommes sur Linux, nous les avons convertis en pem. Dans les appels curl je ne pouvais pas trouver moyen d'inclure à la fois le CERT racine et le CERT intermédiaire, donc je les ai combinés en créant un nouveau fichier PEM et en copiant le CERT intermédiaire et le CERT racine et en le nommant authority.pem. Je ne sais pas si ça marche ou pas et j'aimerais avoir votre avis.

  2. Pour le code actuel Iam obtenir l'erreur N ° d'erreur: 77 erreur Curl: certificat de réglage d'erreur vérifier les emplacements: CAFile: /home/pps/authority.pem CApath:/home/pps/

    Si je désactiver le message d'erreur curl, je reçois une page vierge avec le titre de la page 403 - Interdit. L'accès est refusé.

    Si je commente les lignes CURLOPT_CAPATH et CURLOPT_CAINFO, il donne une page d'erreur http 500 avec le message comme contenu et le suivant en haut.

    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

Si je commente comme ci-dessus et aussi CURLOPT_SSLCERT et CURLOPT_SSLCERTPASSWD donne erreur 403 avec le message en tant que contenu.

Donc, je voudrais vous demander de m'aider en soulignant ce qui ne va pas avec le code actuel.

Merci.

+0

Est-ce que votre 'PROTPLUSSOL_SSO.pem' contient la clé privée (ouvrez avec un éditeur de texte et vérifiez s'il y a une section' --- BEGIN ... PRIVATE KEY --- 'ou si c'est juste --- --- BEGIN CERT Comment avez-vous convertir de '.pfx' à' .pem'? – Bruno

Répondre

0

PHP est livré avec un client de savon:

http://php.net/manual/en/book.soap.php

Vous pouvez lui dire d'utiliser un certificat, en passant une option local_cert au constructeur.

+0

Salut troelskn, merci pour le pointeur, je l'ai essayé passivement mais sans passer les certs, laissez-moi essayer en passant le cert à http://www.protection-plus-solutions.com/escreen/escreen_soapclient.php, mais je ne suis toujours pas sûr de savoir comment spécifier la méthode RequestTicket et si j'ai abordé les certs correctement. – Amitabh