Connexion https hôte avec soapclient: comment fixer SSL problèmes?

TLDR

Je n'arrive pas à se connecter à un point de terminaison https avec un SoapClient. Comme mon wget renvoie une handshake failure, je soupçonne que ce soit la cause.

Comment puis-je faire une demande SOAP à ce serveur avec PHP?

complète

Je suis en train d'essayer de vous connecter à un serveur SOAP (https). Il n'a pas l'authentification par certificat client, de sorte que la connexion doit être assez simple, mais malheureusement il ne l'est pas.

Le problème est que je reçois des Could not connect to host messages.

De la méthode de connexion que j'utilise est de travailler pour un autre serveur et j'ai vérifié que je suis la définition de l'emplacement de ce serveur correctement (changé pour un serveur que je contrôle, et je suis de réponse). Je soupçonne que le problème est avec le https/ssl connexion au serveur.

Situation

  • Je suis de la création d'un PHP Soapclient basé sur un wsdl j'ai localement.
  • Si je change le point de terminaison-je obtenir Demande et en-têtes de Réponse, et tout fonctionne comme prévu.
  • la machine est accessible à partir de mon serveur, si il y a un problème visible lorsque j'utilise wget pour s'y connecter (voir ci-dessous)
    Impossible d'établir la connexion SSL.
  • Le problème est également visible avec openssl connexions (voir ci-dessous)

Ce que j'ai essayé.

Il y a beaucoup de sujets à propos de "pas de connexion!", mais il y a évidemment beaucoup de "mon routeur était mauvais, j'ai fait une faute de frappe dans l'adresse, etc". Je l'ai fait essayer ces paramètres qui ont été suggéré à plusieurs reprises, mais plus comme un "couper /"coller" solution pour être sûr qu'Il n'a pas de travail", puis à partir de véritable raisonnement. Certains commentaires me ajoutée

La création d'un stream_context pour le wsdl options. J'ai essayé

$context = stream_context_create(
              array(
                'ssl' => array(
                           'verify_peer' => false,  //default
                           'allow_self_signed' => true, //needs verify peer, tried that
                           'ciphers'=>"SHA1", //quite random.
                   ),
                'https' => array(
                           'curl_verify_ssl_peer'  => false,
                           'curl_verify_ssl_host'  => false
                          )
      )
            );
$options['stream_context'] = $context;

(d'abord uniquement le ssl options avec verify_peer et allow_self_signed. Puis j'ai ajouté https tableau, puis finalement j'ai ajouté le ciphers clé ssl.)

J'ai trouvé une référence à ce bug, mais 1) je ne reçois pas cet avertissement, 2) il semble être reliés aux procurations et 3) Ma version ne devrait pas avoir le bug plus. Je suis en cours d'exécution php 5.3.10

Quand j'essaie de wget l'url, j'obtiens:

    wget https://[[servername]]/SOAP
    Resolving [[servername]] ([[servername]])... xxx.xxx.xxx.xxx
    Connecting to [[servername]]([[servername]])|xxx.xxx.xxx.xxx|:443... connected.
    OpenSSL: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure

Si j'essaie de me connecter avec openssl, j'obtiens ceci:

$ openssl s_client -connect [[server]]:443 -state
CONNECTED(00000003)
SSL_connect:before/connect initialization
SSL_connect:unknown state
SSL3 alert read:fatal:handshake failure
SSL_connect:error in unknown state
3074463944:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:s23_clnt.c:724:

mais si je force ssl3, j'obtiens un résultat attendu

$ openssl s_client -ssl3 -connect [[server]]:443 -state
CONNECTED(00000003)
SSL_connect:before/connect initialization
SSL_connect:SSLv3 write client hello A
SSL_connect:SSLv3 read server hello A
**happy certificate stuff. this is good**
Protocol  : SSLv3
Cipher    : DHE-RSA-AES256-SHA
**more happy certificate stuff. **

J'ai essayé d'ajouter l'curl-wrapper de cette question avec ssl_version fixé à 3 (comme cela semble fonctionner sur le openssl de commande ci-dessus). Cette enveloppe ne jetez certains paramètres, donc je ne suis pas sûr de savoir comment remplir ce serait. De plus, je reçois toujours une poignée de main d'erreur, à moins que je définir explicitement la vérification de faux. Si je fais ça (voir ci-dessous), je reçois une réponse vide.

curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, false);

Causes

Comme dit plus haut, je soupçonne que le handshake ssl, mais je n'ai aucune idée de comment le résoudre. Je ne soupçonne pas de problèmes avec le wsdl ou le client-création, que la connexion ne fonctionne pas avec un autre wsdl, le même wsdl avec un emplacement différent ensemble etc. C'est purement ce (https) de point de terminaison de me donner des maux de tête.

Tests supplémentaires.

Tout comme le test ci-dessus avec le curl wrapper j'ai essayé d'envoyer un minimum de savon enveloppe @halfwarr semblait le suggérer dans les commentaires. Als renvoie une réponse vide.

Donc, avec au-dessus, il semble que je dois avoir une méthode pour insérer un http 204 de du serveur, mais ce n'est guère de succès. Mais il pourrait y avoir une deuxième problème? Pas sûr.

Je suis en supposant que j'ai besoin d'essayer de forcer le protocole ssl3, mais je n'ai aucune idée de comment (et ce pourrait être le mauvais chemin, si bien que je suis en train de ne pas avoir XY problème ici 🙂

Je n'en ai aucune idée, mais il vaut la peine d'essayer 5.4.x, dans le cas où il y a un problème avec votre version de PHP?
Pas vraiment. L'environnement direct ne sera pas aller vers encore. Cette version est toujours pris en charge, donc je ne suis pas soupçonner un problème (voir aussi la openssl trucs que j'ai juste ajouté: qui ressemble toujours le problème pour moi)
avez-vous configuré le protocole ssl sur votre système?
Qu'entendez-vous par là? Comme vous pouvez le voir dans la question, je peux obtenir openssl pour vous connecter si je spécifie "- ssl3", mais pas si je n'ai pas. Je suppose que c'est un problème de php SoapClient visages, mais je ne suis pas sûr.
Avez-vous essayé d'utiliser cURL pour envoyer du XML pour une enveloppe SOAP et voir ce qui se passe? ( stackoverflow.com/questions/3006977/...) je pense que cela va permettre un moyen facile pour vous de tester les options ssl sans avoir à traiter avec l'extension de soapClient et les autres problèmes qui pourraient introduire

OriginalL'auteur Nanne | 2013-06-05