IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[Web Service] SoapClient 400 Bad Request sur une URL en HTTPS


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre régulier Avatar de eaglesnipe
    Homme Profil pro
    Ingénieur Etudes et Développement
    Inscrit en
    Janvier 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Etudes et Développement
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2008
    Messages : 75
    Points : 76
    Points
    76
    Par défaut [Web Service] SoapClient 400 Bad Request sur une URL en HTTPS
    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 :

    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
    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
    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);
    Le code ne passe jamais l'étape [1] sur le serveur de PROD.
    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.

  2. #2
    Membre régulier Avatar de eaglesnipe
    Homme Profil pro
    Ingénieur Etudes et Développement
    Inscrit en
    Janvier 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Etudes et Développement
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2008
    Messages : 75
    Points : 76
    Points
    76
    Par défaut
    Hello all,

    Après bon nombre de recherches et de mal de tête, je suis finalement parvenu à une solution.

    Il suffit simplement, dans mon cas, de définir une option supplémentaire dans le stream _context :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $context = stream_context_create(
        array(
            'ssl' => array(
                'verify_peer' => false,
                'allow_self_signed' => true,
                'SNI_enabled' => false // <= option à rajouter
            )
        )
    );
    Comme l'indique la documentation PHP :

    SNI_enabled booleanIf set to TRUE server name indication will be enabled. Enabling SNI allows multiple certificates on the same IP address.
    Et comme j'ai appris très récemment que l'ensemble des hosts de nos machines de PROD a été modifié, je pense que c'est très intimement lié :-)

    En tous cas problème résolu et j'espère que ce post pourra en aider d'autres !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Error 400 Bad Request (Service REST) et postman
    Par bulbizarre33 dans le forum Général Java
    Réponses: 6
    Dernier message: 17/12/2018, 12h42
  2. WebService HTTP 400 Bad Request
    Par mrkinfo dans le forum Services Web
    Réponses: 3
    Dernier message: 09/12/2009, 16h41
  3. IIS et HTTP 400 Bad Request
    Par cgone dans le forum IIS
    Réponses: 0
    Dernier message: 29/09/2009, 18h54
  4. C++ Requete GET Http Erreur 400 Bad Request
    Par gy0m76 dans le forum C++
    Réponses: 2
    Dernier message: 02/07/2008, 15h49
  5. Axis2 Error 400 Bad Request
    Par Calahad dans le forum Services Web
    Réponses: 2
    Dernier message: 11/04/2007, 13h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo