SoapClient ошибка получения wsdl с сервиса по https

vartem

Новичок
Приветствую,

Прошу помощи у сообщества, т.к. уже перепробовал все что мог.

Есть веб-сервис (не наш и изменить мы тут ничего не можем), который доступен по адресу https://x.x.x.x:4433/Service/Service.asmx?wsdl. Проблема в том что SSL сертификат у этого URL:
1. Самоподписанный
2. Вместо правильного host-name указана какая-то чушь.

Сам url вполне нормально открывается в интернет-браузере (если указать браузеру что мы согласны с риском и доверяем этому источнику), а так же получается через curl, если указать curl-у:
Код:
        curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,false);
        curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);
Однако SoapClient настойчиво продолжает мне показывать ошибку:
Warning: SoapClient::SoapClient(https://x.x.x.x:4433/Service/Service.asmx?wsdl): failed to open stream: HTTP Warning: SoapClient::SoapClient() request failed!
Warning: I/O warning : failed to load external entity
[WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://x.x.x.x:4433/Service/Service.asmx?wsdl' : failed to load external entity https://x.x.x.x:4433/Service/Service.asmx?wsdl"

Теперь сам вызов SoapClient:
PHP:
$client = new SoapClient('https://x.x.x.x:4433/Service/Service.asmx?wsdl',
            array(
           //     "soap_version"=> SOAP_1_2,
          //      'features' => SOAP_SINGLE_ELEMENT_ARRAYS,
                'trace' => 1,
                'exceptions' => true,

                'cache_wsdl' => WSDL_CACHE_NONE,
                'verifypeer' => false,
                'verifyhost' => false,
                'stream_context' => stream_context_create(
                                                            array(
                                                                'ssl' => array(
                                                                            'verify_peer' => false,
                                                                            'verify_peer_name' => false,
                                                                            'allow_self_signed' => true
                                                                            ),
                                                                'https' => array(
                                                                           'curl_verify_ssl_peer'  => false,
                                                                           'curl_verify_ssl_host'  => false
                                                                          )
                                                                    )
                                                        )
            )
        );
та-же ситуация при запросе этого же url через file_get_contents('https://x.x.x.x:4433/Service/Service.asmx?wsdl', false, $stream_context );
PHP:
$stream_context = stream_context_create([
                                                                'ssl' => array(
                                                                            //'capture_session_meta' => true,
                                                                            'verify_peer' => 0,
                                                                            'verify_peer_name' => 0,
                                                                    //        'allow_self_signed' => true,
                                                                            )
                                                                    ]
                                                        );
file_get_contents('https://x.x.x.x:4433/Service/Service.asmx?wsdl', false, $stream_context );
версия PHP 5.5.30

Подскажите пожалуйста у кого какие идеи, т.к. все свои я уже исчерпал...
 
Последнее редактирование:

grigori

( ͡° ͜ʖ ͡°)
Команда форума
какие именно идеи были опробованы?
почему // 'allow_self_signed' => true, закомментировано?
 

vartem

Новичок
Оно было и откомментировано и закомментировано, но результат тот же. Так что вариант
'verify_peer' => false,
'verify_peer_name' =>false,
'allow_self_signed' => true
тоже был, но он так же не работает :(
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
так что было опробавано? что сказали в гугле?
 

WMix

герр M:)ller
Партнер клуба
А почему кста. самоподписный "кривой" сертификат? два евро жалко в год?
Или иначе, если это локальная сеть, нафига сертификат?
 

vartem

Новичок
Идеи были следующие:
1. Играл по-всячески с параметрами verify_peer, а так же посмотрел что у сертификата сервера тип шифрования TLS_RSA_WITH_AES-128_CBC_SHA,
указал 'ciphers' => 'TLS-RSA-AES-128-CBC-SHA' - начал выдавать ошибки типа handshake error, что судя по всему означает что тип шифрования указан не точно, пробовал выгрузить сертификат сервера в файл и указать путь до него в cafile (понимаю что глупо, но уже отчаяние :))

2. Пробовал создать свой класс, где хотел переопределить функцию обращающуюся к самому вебсервису, но тут у меня ничего не поулучилось, т.к. сам wsdl он судя по всему тянет совершенно неизвестной мне функцией:
class MySoapClient extends SoapClient {

public function __construct($wsdl, $options = array()) {

parent::__construct($wsdl, $options);

}
public function __doRequest($request,$location,$action,$version,$one_way = 0) {
return $this->callCurl($location,$request);
}

ну и callCurl - ф-ция где запрашивается файл через curl
}
 

vartem

Новичок
А почему кста. самоподписный "кривой" сертификат? два евро жалко в год?
Или иначе, если это локальная сеть, нафига сертификат?
Вебсервис не наш, обращаемся к нему по локальному адресу через IPSEC, https в принципе тут лишний, но опять же веб-сервис не наш, а одной крупной компании, которая отвечает что у всех работает а не работает только у нас. Да в принципе и сам вижу что через веб-браузер, в том числе и lynx страница открывается
 
Сверху