Подключение к хосту https с помощью soapclient: как исправить проблемы с SSL?

TLDR

Кажется, я не могу подключиться к конечной точке https с помощью SoapClient. Поскольку мой wget возвращает handshake failure, я подозреваю, что причина в этом.

Как я могу отправить запрос SOAP на этот сервер с помощью PHP?

полный

Я пытаюсь подключиться к SOAP-серверу (https). У него нет проверки подлинности сертификата клиента, поэтому подключение должно быть довольно простым, но, к сожалению, это не так.

Проблема в том, что я продолжаю получать Could not connect to host сообщений.

Метод подключения, который я использую, работает для другого сервера, и я убедился, что правильно устанавливаю местоположение для этого сервера (изменил его на сервер, которым я управляю, и я получаю там ответ). Я подозреваю, что проблема связана с подключением https/ssl к серверу.

Ситуация

  • Я создаю PHP Soapclient на основе wsdl, который у меня есть локально.
  • Если я изменяю конечную точку, я получаю заголовки запроса и ответа, и все работает, как и ожидалось.
  • машина доступна с моего сервера, хотя есть видимая проблема, когда я использую wget для подключения к ней (см. ниже) Невозможно установить SSL-соединение.
  • Проблема также видна с соединениями openssl (см. ниже)

Что я пробовал.

Есть много тем про «нет связи!», но, очевидно, много «мой роутер был неисправен, я сделал опечатку в адресе и т. д.». Я попробовал эти настройки, которые предлагались несколько раз, но больше как решение «вырезать и вставить», чтобы убедиться, что оно не сработает, а не из реальных рассуждений. Некоторые комментарии от меня добавлены

Создание stream_context для параметров wsdl. я пытался

$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;

(сначала только параметры ssl с verify_peer и allow_self_signed. Затем я добавил массив https, затем, наконец, добавил ключ ciphers к ssl.)

Я нашел ссылку на эту ошибку, но 1) я не получаю это предупреждение, 2) похоже, что оно связано с прокси и 3) в моей версии больше не должно быть этой ошибки. Я бегу php 5.3.10

Когда я пытаюсь получить URL-адрес, я получаю:

    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

Если я попытаюсь подключиться с помощью openssl, я получаю следующее:

$ 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:

но если я заставлю ssl3, я получу ожидаемый результат

$ 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. **

Я попытался добавить curl-wrapper из этот вопрос с ssl_version, установленным на 3 (поскольку это работает с командой openssl выше). Эта оболочка отбрасывает некоторые параметры, поэтому я не уверен, насколько это будет полно. Кроме того, я по-прежнему получаю ошибку рукопожатия, если только я явно не установил для проверки значение false. Если я это сделаю (см. ниже), я получу пустой ответ.

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

Причины

Как сказано выше, я подозреваю рукопожатие ssl, но понятия не имею, как это исправить. Я не подозреваю проблем с wsdl или созданием клиента, поскольку соединение работает с другим wsdl, тем же wsdl с другим набором местоположений и т. д. Именно эта (https) конечная точка вызывает у меня головную боль.

Дополнительные тесты.

Как и в предыдущем тесте с оберткой curl, я попытался отправить минимальный мыльный конверт, как, кажется, предложил @halfwarr в комментариях. Als возвращает пустой ответ.

Таким образом, с вышеизложенным кажется, что у меня есть способ выжать http 204 из сервера, но это вряд ли увенчается успехом. Но это может быть вторая проблема? Точно сказать не могу.

Я предполагаю, что мне нужно попытаться принудительно использовать ssl3, но я понятия не имею, как это сделать (и это также может быть неправильный путь, поэтому я пытаюсь не использовать проблема XY здесь :)


person Nanne    schedule 05.06.2013    source источник
comment
Понятия не имею, а стоит ли пробовать 5.4.x, если проблема в вашей версии PHP?   -  person halfer    schedule 05.06.2013
comment
Не совсем. Живая среда пока не будет двигаться в этом направлении. Эта версия по-прежнему поддерживается, поэтому я не подозреваю о проблеме (также см. материалы openssl, которые я только что добавил: мне все еще кажется, что это проблема)   -  person Nanne    schedule 05.06.2013
comment
вы настроили ssl в своей системе?   -  person Rahul11    schedule 05.06.2013
comment
Что ты имеешь в виду? Как вы можете видеть в вопросе, я могу подключиться к openssl, если укажу «-ssl3», но не могу, если не укажу. Я подозреваю, что это проблема, с которой сталкивается и php SoapClient, но я не уверен.   -  person Nanne    schedule 05.06.2013
comment
Вы пытались просто использовать cURL для отправки XML для конверта SOAP и посмотреть, что произойдет? ( stackoverflow.com/questions/3006977/) Я думаю, это позволит вам легко протестировать параметры ssl без необходимости иметь дело с расширением soapClient и другими проблемами, которые могут привести   -  person Halfwarr    schedule 05.06.2013
comment
Хм, интересный момент! завтра первым делом попробую!   -  person Nanne    schedule 05.06.2013


Ответы (3)


Интересный. Попробуйте добавить это:

wget https://[[SERVER]]/soap/ —post-file=request.xml —header=”Content-Type: text/xml” -O response.xml

Результат будет сохранен в виде файла с именем response.xml.

person Matheno    schedule 05.06.2013
comment
Возможно, я не совсем ясно выразился, но смысл в том, чтобы SoapClient подключиться, а wget просто показать, в чем может быть проблема. Я немного перетасуюсь в вопросе - person Nanne; 05.06.2013
comment
drupal.org/node/880862 - person Matheno; 05.06.2013

Последняя версия PHP 5.5.3 позволит вам установить версию SSL. Я видел других, которые могли использовать stream_context, но я тоже не смог получить эту работу.

В качестве обходного пути и отказоустойчивости я использовал уловку, чтобы получить запрос на мыльный конверт (аналогично тому, что вы тестировали выше):

$xml = $client->__getLastRequest()

и отправить через curl:


curl_setopt($ch, CURLOPT_SSLVERSION, 3);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

Это позволяет мне, по крайней мере, двигаться вперед.

person rdizzle    schedule 10.09.2013

Вы включили php_openssl.dll в своем php.ini?

Ссылка:

PHP SOAP не может подключиться к источнику SSL WSDL

person Sid    schedule 06.06.2013
comment
Я не упомянул это конкретно, но я использую Linux :) - person Nanne; 07.06.2013