Bonjour à tous,
Je sollicite la communauté car je rencontre depuis quelques jours un problème que je ne parviens pas à résoudre.
Ce dernier concerne la simple interrogation d'un webservice via un client SOAP PHP.
Je possède 2 serveurs, un serveur permettant de gérer l'application dans un environnement de développement, le second permettant de gérer la production. J'ai codé un script de test, hors application, permettant de faire l'appel au webservice et ce dernier s'exécute parfaitement en DEV mais plante systématiquement en PROD avec l'erreur suivante :
De manière plus précise, voici le code utilisé. Je ne peux malheureusement pas communiqué les infos sur les URL ou autres s'agissant de services sensibles.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 PHP Warning: SoapClient::SoapClient(https://**********/index.php?task=wsdl): failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Request in /var/www/html/test/test.php on line 29 PHP Warning: SoapClient::SoapClient(): I/O warning : failed to load external entity "https://**********/index.php?task=wsdl" in /var/www/html/test/test.php on line 29 PHP Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://**********/index.php?task=wsdl' : failed to load external entity "https://**********/index.php?task=wsdl" in /var/www/html/test/test.php on line 29
Le code ne passe jamais l'étape [1] sur le serveur de PROD.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 $wsdl = 'https://**********/index.php?task=wsdl'; $login = '*****'; $password = '*****'; // Accès proxy $proxy_ip = '***.***.***.***'; $proxy_port = ****; // Suppression de la vérification du certificat $context = stream_context_create( array('ssl' => array( 'verify_peer' => false, 'allow_self_signed' => true ) )); // Options du client SOAP $options = array( 'trace' => 1, 'exceptions' => 0, 'login' => $login, 'password' => $password, 'proxy_host' => $proxy_ip, 'proxy_port' => $proxy_port, 'stream_context' => $context ); try { $clientSoap = new SoapClient($wsdl, $options); // [1] } catch (Exception $e) { die('SOAP CLIENT CONSTRUCT ERROR ' . $e->getMessage()); } try { $ip = '***.***.***.***'; $result = $clientSoap->__soapCall("**********", array("**********" => array("ip" => $ip)), null, null ); } catch (Exception $e) { die('SOAP REQUEST ERROR : ' . $e->getMessage()); } var_dump($result);
Un simple wget (en ayant configuré le proxy sur le système) permet de récupérer le fichier WSDL sans aucun soucis. Il ne s'agit donc pas d'un problème de flux, proxy ou pare-feu (confirmé par un telnet).
S'agissant d'une URL en HTTPS, j'ai vérifié que SSL était bien activé sur le serveur, ce qui est le cas :
openssl (ENV PROD)
OpenSSL support enabled OpenSSL Library Version OpenSSL 1.0.1e-fips 11 Feb 2013 OpenSSL Header Version OpenSSL 1.0.1e-fips 11 Feb 2013
Nous avons toutefois une différence de version avec l'environnement de DEV, mais je ne pense pas que cela justifie le comportement constaté (à moins que ??)
openssl (ENV DEV)
OpenSSL support enabled OpenSSL Library Version OpenSSL 0.9.8e-fips-rhel5 01 Jul 2008 OpenSSL Header Version OpenSSL 0.9.8e-fips-rhel5 01 Jul 2008
J'avoue ne plus savoir vers quelle direction cherchée. Au vu de l'erreur j'ai l'impression que le problème se situe dans l'accès à l'URL en question, mais je ne sais pas pourquoi et mes autres tests (telnet, wget) montrent que tout semble bien aller de ce côté.
Je suis donc preneur de toute nouvelle piste à explorer.
Merci d'avance.
Partager