SOAP по HTTPS. Как его заставить работать

akxxiv

Новичок
Возникла необходимость интегрироваться со сторонним сервисом по API, построенном на SOAP. Описание API здесь
Для тестов попробовал это сделать через SoapUI где все работает нормально - запросы отправляются, ответы получаются.
Начал реализовывать в PHP, и вот тут начались проблемы. Во-первых, по HTTPS был не доступен WSDL, но это решалось установкой сертификата. А вот далее...

PHP:
$login = 'grad';
$password = 'DxB1gma3';
$wsdl = 'https://testservice.synerdocs.ru/ExchangeService.svc?singlewsdl';

$contextOptions = array(
    "ssl"=>array(
        "verify_peer"=>true,
        "allow_self_signed"=>true,
        "cafile"=> __DIR__ . "/cer/synerdocs-rootCA.pem",
        "verify_depth"=>5,
    )
);
$sslContext = stream_context_create($contextOptions);

$client = new SoapClient( $wsdl, [
    'soap_version' => SOAP_1_1,
    'trace' => true,
    'cache_wsdl' => WSDL_CACHE_DISK, //WSDL_CACHE_NONE,
    'stream_context' => $sslContext,
    'ssl_method' => SOAP_SSL_METHOD_SSLv3,

]);

$params = [
    'login' => $login,
    'password' => $password,
];

$result = $client->__soapCall(
    "Authenticate",
    [$params]
);

var_dump($result);
1. Все запросы почему-то идут по HTTP, и как это исправить не через ж...? Если посмотреть WSDL, то там есть 2 точки входа - HTTP и HTTPS, и SOAP почему-то выбирает первый. В тех поддержке сказали:
Есть предположение, что вы используете биндинг BasicHttpBinding_IExchangeService, если это так, то попробуйте отправить через BasicHttpBindingSecure_IExchangeService
И вот вопрос - Есть возможность указать по какому адресу надо стучаться, как отправить через BasicHttpBinding_IExchangeService?
XML:
   <wsdl:service name="ExchangeService">
        <wsdl:port name="BasicHttpBinding_IExchangeService" binding="tns:BasicHttpBinding_IExchangeService">
            <soap:address location="https://testservice.synerdocs.ru/ExchangeService.svc"/>
        </wsdl:port>
        <wsdl:port name="BasicHttpBindingSecure_IExchangeService" binding="tns:BasicHttpBindingSecure_IExchangeService">
            <soap:address location="https://testservice.synerdocs.ru/ExchangeService.svc"/>
        </wsdl:port>
    </wsdl:service>
2. И вторая проблема в том, что даже если запрос был отправлен по HTTPS, я не получаю вообще ни какого ответа. А прямой POST (через file_get_contents ) запрос вообще зависает. Хотя в SoapUI - такой же запрос, с теми же заголовками отрабатывается на ура. Приведу пример своего запроса и того что отсылает SoapUI
Мой:
PHP:
$xml = '<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://synerdocs.ru"><SOAP-ENV:Body><ns1:Authenticate><ns1:login>grad</ns1:login><ns1:password>DxB1gma3</ns1:password></ns1:Authenticate></SOAP-ENV:Body></SOAP-ENV:Envelope>';
        $data_len = strlen($xml);
        $options = array(
            'http' =>
                array(
                    'method'  => 'POST',
                    'protocol_version'  => 1.1,
                    'header'  => "Content-Type: text/xml; charset=utf-8\r\n"
                                //."POST https://testservice.synerdocs.ru/ExchangeService.svc HTTP/1.1\r\n"
                                ."Accept-Encoding: gzip,deflate\r\n"
                                ."Host: testservice.synerdocs.ru\r\n"
                                ."Connection: Keep-Alive\r\n"
                                ."SOAPAction: http://synerdocs.ru/IExchangeService/Authenticate\r\n"
                                ."Content-Length: {$data_len}\r\n"
                                ."\r\n"
                                .$xml,
                    //'content' => $xml
                    'timeout' => 10
                ),
            'ssl' => [
                "verify_peer"=>true,
                "allow_self_signed"=>true,
                "cafile"=> __DIR__ . "/cer/synerdocs-rootCA.pem",
                "verify_depth"=>5,
            ],

        );

        $context = stream_context_create($options);
        $res = file_get_contents( 'https://testservice.synerdocs.ru/ExchangeService.svc', false, $context );
А вот скрин из SoapUI Картинка

Есть идеи что я не так делаю? Может сталкивался кто?
 

AnrDaemon

Продвинутый новичок
C того, что сначала научись пользоваться инструментом, потом пиши код.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
тебе придется ставить verify_peer => false, потому что по твоей ссылке на wsdl - невалидный сертификат. Поэтому смысла нет и подкладывать cafile.
Убери 'ssl_method' => SOAP_SSL_METHOD_SSLv3, SSLv3 - это не то, что ты думаешь.
Другой локейшн можно выбрать через __setLocation



Что бы разобраться реально ушло две минуты в гугле.
 

akxxiv

Новичок
тебе придется ставить verify_peer => false, потому что по твоей ссылке на wsdl - невалидный сертификат. Поэтому смысла нет и подкладывать cafile.
Убери 'ssl_method' => SOAP_SSL_METHOD_SSLv3, SSLv3 - это не то, что ты думаешь.
Другой локейшн можно выбрать через __setLocation



Что бы разобраться реально ушло две минуты в гугле.
Спасибо. Что-то я зациклился на этих сертификатах....
 

fixxxer

К.О.
Партнер клуба
Насколько я понимаю, на продакшен там нормальный сертификат, а self signed только на тестовом сервисе.
Так что смысла возиться с подкладыванием CA нет никакого.
 

AnrDaemon

Продвинутый новичок
Там нормальный. Self-signed - это когда issuer = subject.
Чего там нехватает, так это root CA, только промежуточный есть. Кто-то сервер через Ж настраивал.
 

AnrDaemon

Продвинутый новичок
Нормальный.
Вот wmix.local - self-signed, как впрочем и все root CA.
 

fixxxer

К.О.
Партнер клуба
А я и не смотрел, если честно, я предположил. Поинт в том, что пофиг для тестового, воткнул verify_peer=false и тестируй себе.
По тому же урлу, но не "testservice", а просто "service", с сертификатом все хорошо.
 

AnrDaemon

Продвинутый новичок
Невалидный, потому что подписан недоверенным CA.
Не надо путать тёплое с мягким. Невалидный - это сертификат, содержащий ошибки. Просроченный, без нужных OID и т.д.
Недоверенный - это не ошибка сертификата, это особенность настройки системы.
 
Сверху