2017-09-06 4 views
1

J'essaye d'appeler (via PHP script) un serveur web distant (SOAP) sur https, il nécessite un certificat protégé par mot de passe. J'utilise nusoap pour faire l'appel, mais je reçois toujours l'erreur suivanteerreur cURL 58 en essayant d'accéder au serveur web de savon

nusoap_client: got erreur wsdl: Obtenir https://ws-t.pitre.tn.it/wcfrouting/wsdl/Documents.wsdl - HTTP: ERREUR cURL: 58: impossible d'utiliser le certificat client (pas de clé trouvée ou mauvaise phrase de passe?)

require_once("../nusoap/lib/nusoap.php"); 

$pitre_wsdl = "https://ws-t.pitre.tn.it/wcfrouting/wsdl/Documents.wsdl"; 
$client = new nusoap_client($pitre_wsdl, "wsdl"); 
$err = $client->getError(); 

if ($err) { 
    print("Error"); 
    exit(); 
} 

$client->setCredentials(
    "", 
    "", 
    "certificate", 
    array (
     "sslcertfile" => "../pitre/cert.p12", 
     "sslkeyfile" => "../pitre/cert.p12", 
     "certpassword" => "mypass", 
     "verifypeer" => FALSE, 
     "verifyhost" => FALSE 
    ) 
); 

$result = $client->call(
    "GetTemplatesDocuments", 
    array (
     "CodeAdm" => "myCode" 
    ) 
); 

Avec le navigateur je peux accéder à la wisdl sans problème. J'ai essayé la réponse suivante:

cURL with SSL certificates fails: error 58 unable to set private key file

Je suis le même résultat.

Ai-je raté quelque chose?

Répondre

1

J'ai trouvé la réponse, ma solution est la suivante:

je n'étais pas en mesure de le faire fonctionner avec nu_soap donc je suis passé à SoapClient

Fist de tout ce que je devais convertir mon certificat P12 au format pem en utilisant OpenSSL

openssl pkcs12 -in certificato.p12 -out certificato.pem -clcerts 

Je téléchargé les certificats de CA d'ici https://curl.haxx.se/docs/caextract.html

Voici mon code de travail

$params->a    = "a"; 
$params->b    = "b"; 
$params->c    = "c"; 
$params->d    = "d"; 
$params->e    = "e"; 

$context = stream_context_create(array (
    "ssl" => array (
     "verify_peer"  => false, 
     "verify_peer_name" => true, 
     "local_cert"  => getcwd()."\certificato.pem", //complete path is mandatory 
     "passphrase"  => "mypassphrase", 
     "allow_self_signed" => true 
    ), 
    "https" => array (
     "curl_verify_ssl_peer" => false, 
     "curl_verify_ssl_host" => false 
    ) 
)); 

$pitre_client = new SoapClient($pitre_wsdl, array (
    "trace"    => 1, 
    "exceptions"  => true, 
    "location"   => "https://ws-t.pitre.tn.it/wcfrouting/servicerouter.svc", 
    "cafile"   => getcwd()."\cacert.pem", //complete path is mandatory 
    "stream_context" => $context 
)); 

// the call 
$response = $pitre_client->GetTemplatesDocuments(
    array (
     'request' => $params //request key can be different 
    ) 
); 

J'espère que cela aidera quelqu'un face à la même question