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 здесь :)
SoapClient, но я не уверен. - person Nanne   schedule 05.06.2013