Подтвердить что ты не робот

Выполнение SOAP-вызова в PHP и установка версии SSL

Я создал несколько скриптов, работающих с внешним WSDL. Я столкнулся с тем, что мне нужно интегрировать в нашу систему, и я не могу работать. Я пробовал неделю без каких-либо результатов.

script не удалось создать конструктор уже:

$client = new SoapClient("https://webtjener09.kred.no/TestWebservice/OppdragServiceSoapHttpPort?WSDL");

Дает ошибку:

PHP Fatal error:  SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://webtjener09.kred.no/TestWebservice/OppdragServiceSoapHttpPort?WSDL' : failed to load external entity "https://webtjener09.kred.no/TestWebservice/OppdragServiceSoapHttpPort?WSDL"

У меня есть openssl, установленный и работающий с PHP, и помните, что у меня уже есть другие рабочие SOAP-вызовы для другого WSDL через SSL. Я узнал, что я не могу решить это с помощью сертификата, поскольку он не работает уже в конструкторе.

Но: Я попытался подключиться к удаленному серверу с командной строкой openssl, и эта команда также потерпела неудачу:

openssl s_client -connect webtjener09.kred.no:443 -state

Но потом я попытался принудительно подключить его к SSL3, и он отлично работал, как это:

openssl s_client -ssl3 -connect webtjener09.kred.no:443 -state

Итак, я подумал, что мне нужно сопоставить SSL-версию удаленного сервера. Чтобы удвоить, я также попытался сделать соединение cURL через PHP, и он провалился, пока я не добавил форсирование версии SSL следующим образом:

curl_setopt($ch, CURLOPT_SSLVERSION, 3);

Добавление CURLOPT_SSLVERSION к соединению cURL сделало это нормально. И тогда корень моего вопроса:

Как заставить PHP-мыльный конструктор/вызов использовать SSL3. Мне кажется, что это должно быть решением. Но я не смог узнать, как настроить функцию PHP SOAP только на использование SSL3. Поскольку как командная строка -openssl-, так и PHP cURL работают с принудительным SSL3, я предполагаю, что то же самое произойдет с моей SOAP-функцией?

Входы, пожалуйста?

(Использование Ubuntu Linux, PHP 5.3.3)

4b9b3361

Ответ 1

У меня была та же проблема, следующая оболочка решила ее (я должен был заставить SSL2)

class StupidWrapperForOracleServer extends SoapClient {
  protected function callCurl($url, $data, $action) {
     $handle   = curl_init();
     curl_setopt($handle, CURLOPT_URL, $url);
     curl_setopt($handle, CURLOPT_HTTPHEADER, Array("Content-Type: text/xml", 'SOAPAction: "' . $action . '"'));
     curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
     curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
     curl_setopt($handle, CURLOPT_SSLVERSION, 2);
     $response = curl_exec($handle);
     if (empty($response)) {
       throw new SoapFault('CURL error: '.curl_error($handle),curl_errno($handle));
     }
     curl_close($handle);
     return $response;
   }

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

Btw. если это не удается при загрузке части файла WSDL, загрузите WSDL вручную (например, с помощью curl) и используйте этот файл локально. IMHO __doRequest не вызывается на этапе загрузки WSDL.

file_put_contents(dirname(__FILE__) .'/Server.wsdl',get_wsdl()); //get_wsdl uses the same wrapper as above
$oWS = new StupidWrapperForOracleServer(dirname(__FILE__) .'/Server.wsdl',array('trace'=>1,'cache_wsdl'=>0));

Ответ 2

Как и в PHP 5.5.0, я считаю, что вы можете сделать

$client = new SoapClient("https://webtjener09.kred.no/TestWebservice/OppdragServiceSoapHttpPort?WSDL", array(
    'ssl_method' => SOAP_SSL_METHOD_SSLv3
));

Ответ 3

Вместо создания оболочки вы можете попробовать добавить следующие фрагменты кода?

$stream_opts = array(
//      'ssl'=>array('ciphers'=>"3DES" // also working
//      further ciphers on http://www.openssl.org/docs/apps/ciphers.html
        'ssl'=>array('ciphers'=>"SHA1"
      )
);

$myStreamContext = stream_context_create($stream_opts);
$soapOptions['stream_context'] = $myStreamContext;
$soapClient = new SoapAuthClient("https://...", $soapOptions);

Удачи!

Ответ 4

Попробуйте 'sslv3://webtjener09....' или используйте класс оболочки, где вы можете установить требуемую опцию cURL.

Ответ 5

Если вы используете Oracle Weblogic 11g для размещения своих веб-сервисов под SSL, убедитесь, что вы используете реализацию SSL на основе JSSE.

Войдите в консоль Weblogic и перейдите на Сервер → (ваш сервер) → Конфигурация- > SSL- > Дополнительно и установите флажок Использовать JSSE SSL.

Более подробную информацию можно найти в Руководствах веб-журнала

Ответ 6

Будьте осторожны, если вы используете кодировку utf-8.
Это решение работает хорошо, но вы должны объявить кодировку в заголовке Curl.

curl_setopt($handle, CURLOPT_HTTPHEADER, Array("Content-Type: text/xml; charset = utf-8", 'SOAPAction: "' . $action . '"')