Выполнение SOAP-вызова в PHP и настройка версии SSL - PullRequest
13 голосов
/ 18 января 2011

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

Сценарий уже не может создать конструктор:

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

Ответы [ 6 ]

11 голосов
/ 27 января 2011

У меня была такая же проблема, ее обернула следующая обертка (мне пришлось принудительно установить 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));
5 голосов
/ 13 декабря 2013

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

$client = new SoapClient("https://webtjener09.kred.no/TestWebservice/OppdragServiceSoapHttpPort?WSDL", array(
    'ssl_method' => SOAP_SSL_METHOD_SSLv3
));
2 голосов
/ 27 августа 2012

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

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

Удачи!

1 голос
/ 18 января 2011

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

0 голосов
/ 04 октября 2013

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

curl_setopt($handle, CURLOPT_HTTPHEADER, Array("Content-Type: text/xml; charset = utf-8", 'SOAPAction: "' . $action . '"')
0 голосов
/ 05 марта 2013

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...